From 279124cc19f2eb535d34723d5dfe720d6f033984 Mon Sep 17 00:00:00 2001 From: lyuba Date: Sun, 22 May 2011 01:32:34 +0200 Subject: [PATCH 001/290] font styles in the @font-face --- .../stylesheets/compass/css3/_font-face.scss | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_font-face.scss b/frameworks/compass/stylesheets/compass/css3/_font-face.scss index b110d25a..cd2529e1 100644 --- a/frameworks/compass/stylesheets/compass/css3/_font-face.scss +++ b/frameworks/compass/stylesheets/compass/css3/_font-face.scss @@ -6,6 +6,8 @@ // * $font-files is required using font-files('relative/location', 'format'). // for best results use this order: woff, opentype/truetype, svg // * $eot is required by IE, and is a relative location of the eot file. +// * $weight shows if the font is bold, defaults to normal +// * $style defaults to normal, might be also italic // * For android 2.2 Compatiblity, please ensure that your web page has // a meta viewport tag. // * To support iOS < 4.2, an SVG file must be provided @@ -13,10 +15,19 @@ // If you need to generate other formats check out the Font Squirrel // [font generator](http://www.fontsquirrel.com/fontface/generator) +// In order to refer to a specific style of the font in your stylesheets as +// e.g. "font-style: italic;", you may add a couple of @font-face includes +// containing the respective font files for each style and specying +// respective the $style parameter. + +// Order of the includes matters, and it is: normal, bold, italic, bold+italic. + @mixin font-face( $name, $font-files, - $eot: false + $eot: false, + $weight: normal, + $style: normal ) { $iefont: unquote("#{$eot}?iefix"); @font-face { @@ -25,12 +36,14 @@ src: font-url($eot); $font-files: font-url($iefont) unquote("format('eot')"), $font-files; } - src: $font-files; + src: $font-files; + font-weight: $weight; + font-style: $style; } } // EXAMPLE -// +font-face("this name", font-files("this.woff", "woff", "this.otf", "opentype"), "this.eot") +// +font-face("this name", font-files("this.woff", "woff", "this.otf", "opentype"), "this.eot", bold, italic) // // will generate: // @@ -40,4 +53,6 @@ // src: local("☺"), // url('fonts/this.otf') format('woff'), // url('fonts/this.woff') format('opentype'); +// font-weight: bold; +// font-style: italic; // } From e31e62bdd9cd7913f5a37742145bd19aa120dd4b Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 28 May 2011 02:11:30 -0700 Subject: [PATCH 002/290] Strong tags in the docs should be bold. --- doc-src/content/stylesheets/partials/_typography.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc-src/content/stylesheets/partials/_typography.scss b/doc-src/content/stylesheets/partials/_typography.scss index fe85f130..3e70c53a 100644 --- a/doc-src/content/stylesheets/partials/_typography.scss +++ b/doc-src/content/stylesheets/partials/_typography.scss @@ -29,7 +29,8 @@ ul { list-style: none; margin-bottom: 1em;} h2 { line-height: 1.3em; margin-top: 0; padding-top: 3px;} } -em { font-style: italic; } +em { font-style: italic; } +strong { font-weight: bold; } #page > article { ul ul { padding-left: 1em; } From 5681f38e50a96cec6e3fd3177069043e76d592d6 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 3 Jun 2011 09:44:24 -0700 Subject: [PATCH 003/290] Better string representation for the sprite importer. --- lib/compass/sass_extensions/sprites/sprites.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprites.rb b/lib/compass/sass_extensions/sprites/sprites.rb index 7431983f..b03728fb 100644 --- a/lib/compass/sass_extensions/sprites/sprites.rb +++ b/lib/compass/sass_extensions/sprites/sprites.rb @@ -47,7 +47,7 @@ module Compass end def to_s - "" + self.class.name end def hash From 4852e7803cdf655292d84dab1220a2037ed06e9d Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 3 Jun 2011 09:45:51 -0700 Subject: [PATCH 004/290] Fix a bug where import paths are added twice when using add_import_path in a configuration file. --- lib/compass/configuration/serialization.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/configuration/serialization.rb b/lib/compass/configuration/serialization.rb index ff41ecc2..bf7a5288 100644 --- a/lib/compass/configuration/serialization.rb +++ b/lib/compass/configuration/serialization.rb @@ -27,6 +27,7 @@ module Compass if @added_import_paths self.additional_import_paths ||= [] self.additional_import_paths += @added_import_paths + self.additional_import_paths.uniq! end issue_deprecation_warnings end From 1b689ce966d16e5e797a8933cae9ed5024569051 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 3 Jun 2011 10:29:42 -0700 Subject: [PATCH 005/290] Basic Rails 3.1 integration. --- lib/compass/app_integration/rails.rb | 15 ++++-- .../app_integration/rails/actionpack2x.rb | 10 ++++ .../action_controller.rb | 0 .../sass_plugin.rb | 0 .../{actionpack2 => actionpack2x}/urls.rb | 0 .../app_integration/rails/actionpack30.rb | 11 ++++ .../{actionpack3 => actionpack30}/railtie.rb | 5 +- .../app_integration/rails/actionpack31.rb | 5 ++ .../rails/actionpack31/railtie.rb | 50 +++++++++++++++++++ .../rails/configuration_defaults.rb | 34 +++++++++---- lib/compass/app_integration/rails/runtime.rb | 22 +++----- lib/compass/configuration/helpers.rb | 6 +++ 12 files changed, 127 insertions(+), 31 deletions(-) create mode 100644 lib/compass/app_integration/rails/actionpack2x.rb rename lib/compass/app_integration/rails/{actionpack2 => actionpack2x}/action_controller.rb (100%) rename lib/compass/app_integration/rails/{actionpack2 => actionpack2x}/sass_plugin.rb (100%) rename lib/compass/app_integration/rails/{actionpack2 => actionpack2x}/urls.rb (100%) create mode 100644 lib/compass/app_integration/rails/actionpack30.rb rename lib/compass/app_integration/rails/{actionpack3 => actionpack30}/railtie.rb (89%) create mode 100644 lib/compass/app_integration/rails/actionpack31.rb create mode 100644 lib/compass/app_integration/rails/actionpack31/railtie.rb diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb index 06bc7764..b734d1af 100644 --- a/lib/compass/app_integration/rails.rb +++ b/lib/compass/app_integration/rails.rb @@ -24,8 +24,10 @@ module Compass end def configuration - Compass::Configuration::Data.new('rails'). - extend(ConfigurationDefaults) + config = Compass::Configuration::Data.new('rails') + config.extend(ConfigurationDefaults) + config.extend(ConfigurationDefaultsWithAssetPipeline) if Sass::Util.ap_geq?('3.1.0.beta') + config end def env @@ -48,12 +50,17 @@ module Compass end end - def initialize!(config = nil) + def check_for_double_boot! if booted? - Compass::Util.compass_warn("Warning: Compass was booted twice. Compass has a Railtie now; please remove your intializer.") + Compass::Util.compass_warn("Warning: Compass was booted twice. If you're using Rails 3, Compass has a Railtie now; please remove your compass intializer.") else booted! end + end + + # Rails 2.x projects use this in their compass initializer. + def initialize!(config = nil) + check_for_double_boot! config ||= Compass.detect_configuration_file(root) Compass.add_project_configuration(config, :project_type => :rails) Compass.discover_extensions! diff --git a/lib/compass/app_integration/rails/actionpack2x.rb b/lib/compass/app_integration/rails/actionpack2x.rb new file mode 100644 index 00000000..f48299bb --- /dev/null +++ b/lib/compass/app_integration/rails/actionpack2x.rb @@ -0,0 +1,10 @@ +%w(action_controller sass_plugin urls).each do |lib| + require "compass/app_integration/rails/actionpack2x/#{lib}" +end + +# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? +class Sass::Script::Functions::EvaluationContext + include Sass::Script::Functions + private + include ActionView::Helpers::AssetTagHelper +end diff --git a/lib/compass/app_integration/rails/actionpack2/action_controller.rb b/lib/compass/app_integration/rails/actionpack2x/action_controller.rb similarity index 100% rename from lib/compass/app_integration/rails/actionpack2/action_controller.rb rename to lib/compass/app_integration/rails/actionpack2x/action_controller.rb diff --git a/lib/compass/app_integration/rails/actionpack2/sass_plugin.rb b/lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb similarity index 100% rename from lib/compass/app_integration/rails/actionpack2/sass_plugin.rb rename to lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb diff --git a/lib/compass/app_integration/rails/actionpack2/urls.rb b/lib/compass/app_integration/rails/actionpack2x/urls.rb similarity index 100% rename from lib/compass/app_integration/rails/actionpack2/urls.rb rename to lib/compass/app_integration/rails/actionpack2x/urls.rb diff --git a/lib/compass/app_integration/rails/actionpack30.rb b/lib/compass/app_integration/rails/actionpack30.rb new file mode 100644 index 00000000..05e24df8 --- /dev/null +++ b/lib/compass/app_integration/rails/actionpack30.rb @@ -0,0 +1,11 @@ +# TODO figure something out so image_path works with rails integration +%w(railtie).each do |lib| + require "compass/app_integration/rails/actionpack30/#{lib}" +end + +# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? +class Sass::Script::Functions::EvaluationContext + include Sass::Script::Functions + private + include ActionView::Helpers::AssetTagHelper +end diff --git a/lib/compass/app_integration/rails/actionpack3/railtie.rb b/lib/compass/app_integration/rails/actionpack30/railtie.rb similarity index 89% rename from lib/compass/app_integration/rails/actionpack3/railtie.rb rename to lib/compass/app_integration/rails/actionpack30/railtie.rb index a3fc5498..2e52ae3b 100644 --- a/lib/compass/app_integration/rails/actionpack3/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack30/railtie.rb @@ -40,7 +40,10 @@ module Compass initializer "compass.initialize_rails" do |app| # Configure compass for use within rails, and provide the project configuration # that came via the rails boot process. - Compass::AppIntegration::Rails.initialize!(app.config.compass) + Compass::AppIntegration::Rails.check_for_double_boot! + Compass.discover_extensions! + Compass.configure_sass_plugin! + Compass.handle_configuration_change! end end end \ No newline at end of file diff --git a/lib/compass/app_integration/rails/actionpack31.rb b/lib/compass/app_integration/rails/actionpack31.rb new file mode 100644 index 00000000..bbd2d531 --- /dev/null +++ b/lib/compass/app_integration/rails/actionpack31.rb @@ -0,0 +1,5 @@ +# TODO figure something out so image_path works with rails integration +%w(railtie).each do |lib| + require "compass/app_integration/rails/actionpack31/#{lib}" +end + diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb new file mode 100644 index 00000000..6604e836 --- /dev/null +++ b/lib/compass/app_integration/rails/actionpack31/railtie.rb @@ -0,0 +1,50 @@ +require 'compass' +require 'rails' + +class Rails::Railtie::Configuration + # Adds compass configuration accessor to the application configuration. + # + # If a configuration file for compass exists, it will be read in and + # the project's configuration values will already be set on the config + # object. + # + # For example: + # + # module MyApp + # class Application < Rails::Application + # config.compass.line_comments = !Rails.env.production? + # config.compass.fonts_dir = "app/assets/fonts" + # end + # end + # + # It is suggested that you create a compass configuration file if you + # want a quicker boot time when using the compass command line tool. + # + # For more information on available configuration options see: + # http://compass-style.org/help/tutorials/configuration-reference/ + def compass + @compass ||= begin + data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file)) + config_data + else + Compass::Configuration::Data.new("rails_config") + end + data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded. + Compass.add_project_configuration(data) + data + end + @compass + end +end + +module Compass + class Railtie < Rails::Railtie + initializer "compass.initialize_rails" do |app| + # Configure compass for use within rails, and provide the project configuration + # that came via the rails boot process. + Compass::AppIntegration::Rails.check_for_double_boot! + Compass.discover_extensions! + Compass.configure_rails!(app) + end + end +end \ No newline at end of file diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb index fbab17e2..06aaf311 100644 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ b/lib/compass/app_integration/rails/configuration_defaults.rb @@ -1,6 +1,28 @@ module Compass module AppIntegration module Rails + + module ConfigurationDefaultsWithAssetPipeline + # These methods overwrite the old rails defaults + # when rails 3.1 is detected. + + def default_sass_dir + File.join("app", "assets", "stylesheets") + end + + def default_images_dir + File.join("app", "assets", "images") + end + + def default_fonts_dir + File.join("app", "assets", "fonts") + end + + def default_javascripts_dir + File.join("app", "assets", "javascripts") + end + end + module ConfigurationDefaults def project_type_without_default @@ -8,11 +30,7 @@ module Compass end def default_sass_dir - if Sass::Util.ap_geq?('3.1.0.beta') - File.join("app", "assets", "stylesheets") - else - File.join("app", "stylesheets") - end + File.join("app", "stylesheets") end def default_css_dir @@ -28,11 +46,7 @@ module Compass end def default_javascripts_dir - if Sass::Util.ap_geq?('3.1.0.beta') - File.join("app", "assets", "javascripts") - else - File.join("public", "javascripts") - end + File.join("public", "javascripts") end def default_http_images_path diff --git a/lib/compass/app_integration/rails/runtime.rb b/lib/compass/app_integration/rails/runtime.rb index d2765ef0..815fd29f 100644 --- a/lib/compass/app_integration/rails/runtime.rb +++ b/lib/compass/app_integration/rails/runtime.rb @@ -3,25 +3,15 @@ unless defined?(Compass::RAILS_LOADED) begin require 'action_pack/version' if ActionPack::VERSION::MAJOR >= 3 - # TODO figure something out so image_path works with rails integration - %w(railtie).each do |lib| - require "compass/app_integration/rails/actionpack3/#{lib}" + if ActionPack::VERSION::MINOR < 1 + require 'compass/app_integration/rails/actionpack30' + else + require 'compass/app_integration/rails/actionpack31' end else - %w(action_controller sass_plugin urls).each do |lib| - require "compass/app_integration/rails/actionpack2/#{lib}" - end + require 'compass/app_integration/rails/actionpack2x' end - rescue LoadError => e + rescue LoadError, NameError $stderr.puts "Compass could not access the rails environment." - rescue NameError => e - $stderr.puts "Compass could not access the rails environment." - end - - # Wierd that this has to be re-included to pick up sub-modules. Ruby bug? - class Sass::Script::Functions::EvaluationContext - include Sass::Script::Functions - private - include ActionView::Helpers::AssetTagHelper end end diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index db6f8af6..9017f735 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -77,6 +77,12 @@ module Compass end end + def configure_rails!(app) + app.config.compass.to_sass_engine_options.each do |key, value| + app.config.sass.send(:"#{key}=", value) + end + end + def sass_engine_options configuration.to_sass_engine_options end From 1a84305a04cae3ce639c5b73b21d7204a5e00361 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 3 Jun 2011 15:06:02 -0700 Subject: [PATCH 006/290] Fix encoding issue. --- .../stylesheets/compass/css3/_font-face.scss | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_font-face.scss b/frameworks/compass/stylesheets/compass/css3/_font-face.scss index b110d25a..6c7d511c 100644 --- a/frameworks/compass/stylesheets/compass/css3/_font-face.scss +++ b/frameworks/compass/stylesheets/compass/css3/_font-face.scss @@ -12,7 +12,10 @@ // // If you need to generate other formats check out the Font Squirrel // [font generator](http://www.fontsquirrel.com/fontface/generator) - +// +// Example: +// +// +font-face("this name", font-files("this.woff", "woff", "this.otf", "opentype"), "this.eot") @mixin font-face( $name, $font-files, @@ -28,16 +31,3 @@ src: $font-files; } } - -// EXAMPLE -// +font-face("this name", font-files("this.woff", "woff", "this.otf", "opentype"), "this.eot") -// -// will generate: -// -// @font-face { -// font-family: 'this name'; -// src: url('fonts/this.eot'); -// src: local("☺"), -// url('fonts/this.otf') format('woff'), -// url('fonts/this.woff') format('opentype'); -// } From 52e41d0455f717f6ebee0841dfb3359a2fdbdf41 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 3 Jun 2011 15:29:47 -0700 Subject: [PATCH 007/290] This file has utf-8 chars in the comments. --- frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss b/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss index 1822bb11..b4b9cfd0 100644 --- a/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +++ b/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss @@ -1,3 +1,4 @@ +@charset "utf-8"; @import "typography"; $alternate-text-font : "Warnock Pro", "Goudy Old Style", "Palatino", "Book Antiqua", Georgia, serif !default; From 696d84562d63a3e799efa73a06ba9f24b8d5b73a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 10 Jun 2011 16:00:56 -0700 Subject: [PATCH 008/290] Track rails branch as a different version state. --- VERSION.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.yml b/VERSION.yml index 968af04e..8f30c9a2 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,6 +2,6 @@ :major: 0 :minor: 11 :patch: 3 -:state: rc +:state: rails :build: 0 :name: Antares From 2772a70e008ca8ef22ddf05451d145d125db4266 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 11 Jun 2011 23:59:00 -0700 Subject: [PATCH 009/290] travis.ci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3bb2dc2d..a388edde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,4 @@ rvm: - jruby - rbx - ree -script: "bundle exec rake test" +script: "bundle exec rake test features" From cfe5b8ed7e2a2b54f1e0f425ba2451269a75ed71 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 15 Jun 2011 23:37:23 -0400 Subject: [PATCH 010/290] refactor --- Gemfile.lock | 78 ++++++++--------- Rakefile | 10 +++ lib/compass/commands/sprite.rb | 7 +- .../sass_extensions/functions/sprites.rb | 2 +- .../sass_extensions/sprites/sprite_map.rb | 10 ++- lib/compass/sprite_importer.rb | 83 ++++++------------- test/test_helper.rb | 15 +++- test/units/sprites/image_test.rb | 12 +-- test/units/sprites/importer_test.rb | 22 +++-- test/units/sprites/sprite_map_test.rb | 13 ++- 10 files changed, 121 insertions(+), 131 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 319f703a..74677031 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,13 @@ GIT remote: git://github.com/johnbintz/fakefs.git - revision: 005ddaaeb2b2881391c31ac9846a55ce5a42c206 + revision: 7363b6f13bfcd9f583bbf7cd1e0d65c2dc656db7 specs: fakefs (0.3.1) PATH remote: . specs: - compass (0.11.3.b352e8b) + compass (0.11.3.c8cb9f2) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -17,12 +17,12 @@ GEM specs: ZenTest (4.5.0) abstract (1.0.0) - actionmailer (3.0.7) - actionpack (= 3.0.7) - mail (~> 2.2.15) - actionpack (3.0.7) - activemodel (= 3.0.7) - activesupport (= 3.0.7) + actionmailer (3.0.9.rc5) + actionpack (= 3.0.9.rc5) + mail (~> 2.2.19) + actionpack (3.0.9.rc5) + activemodel (= 3.0.9.rc5) + activesupport (= 3.0.9.rc5) builder (~> 2.1.2) erubis (~> 2.6.6) i18n (~> 0.5.0) @@ -30,21 +30,21 @@ GEM rack-mount (~> 0.6.14) rack-test (~> 0.5.7) tzinfo (~> 0.3.23) - activemodel (3.0.7) - activesupport (= 3.0.7) + activemodel (3.0.9.rc5) + activesupport (= 3.0.9.rc5) builder (~> 2.1.2) i18n (~> 0.5.0) - activerecord (3.0.7) - activemodel (= 3.0.7) - activesupport (= 3.0.7) - arel (~> 2.0.2) + activerecord (3.0.9.rc5) + activemodel (= 3.0.9.rc5) + activesupport (= 3.0.9.rc5) + arel (~> 2.0.10) tzinfo (~> 0.3.23) - activeresource (3.0.7) - activemodel (= 3.0.7) - activesupport (= 3.0.7) - activesupport (3.0.7) - addressable (2.2.5) - arel (2.0.9) + activeresource (3.0.9.rc5) + activemodel (= 3.0.9.rc5) + activesupport (= 3.0.9.rc5) + activesupport (3.0.9.rc5) + addressable (2.2.6) + arel (2.0.10) autotest (4.4.6) ZenTest (>= 4.4.1) autotest-fsevent (0.2.5) @@ -61,7 +61,7 @@ GEM term-ansicolor (~> 1.0.5) diff-lcs (1.1.2) em-dir-watcher (0.9.4) - em-websocket (0.2.1) + em-websocket (0.3.0) addressable (>= 2.1.1) eventmachine (>= 0.12.9) erubis (2.6.6) @@ -71,14 +71,14 @@ GEM gherkin (2.2.9) json (~> 1.4.6) term-ansicolor (~> 1.0.5) - haml (3.1.1) + haml (3.1.2) i18n (0.5.0) json (1.4.6) livereload (1.6) em-dir-watcher (>= 0.1) em-websocket (>= 0.1.2) ruby-json (>= 1.1.2) - mail (2.2.17) + mail (2.2.19) activesupport (>= 2.3.6) i18n (>= 0.4.0) mime-types (~> 1.16) @@ -86,27 +86,29 @@ GEM mime-types (1.16) mocha (0.9.12) polyglot (0.3.1) - rack (1.2.2) + rack (1.2.3) rack-mount (0.6.14) rack (>= 1.0.0) rack-test (0.5.7) rack (>= 1.0) - rails (3.0.7) - actionmailer (= 3.0.7) - actionpack (= 3.0.7) - activerecord (= 3.0.7) - activeresource (= 3.0.7) - activesupport (= 3.0.7) + rails (3.0.9.rc5) + actionmailer (= 3.0.9.rc5) + actionpack (= 3.0.9.rc5) + activerecord (= 3.0.9.rc5) + activeresource (= 3.0.9.rc5) + activesupport (= 3.0.9.rc5) bundler (~> 1.0) - railties (= 3.0.7) - railties (3.0.7) - actionpack (= 3.0.7) - activesupport (= 3.0.7) + railties (= 3.0.9.rc5) + railties (3.0.9.rc5) + actionpack (= 3.0.9.rc5) + activesupport (= 3.0.9.rc5) rake (>= 0.8.7) + rdoc (~> 3.4) thor (~> 0.14.4) - rake (0.8.7) + rake (0.9.2) rb-fsevent (0.4.0) rcov (0.9.9) + rdoc (3.6.1) rspec (2.0.1) rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) @@ -118,16 +120,16 @@ GEM rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) ruby-json (1.1.2) - ruby-prof (0.10.5) + ruby-prof (0.10.7) rubyzip (0.9.4) - sass (3.1.1) + sass (3.1.2) sys-uname (0.8.5) term-ansicolor (1.0.5) thor (0.14.6) timecop (0.3.5) treetop (1.4.9) polyglot (>= 0.3.1) - tzinfo (0.3.26) + tzinfo (0.3.28) PLATFORMS ruby diff --git a/Rakefile b/Rakefile index e077d6f8..40e25323 100644 --- a/Rakefile +++ b/Rakefile @@ -29,6 +29,16 @@ To run with an alternate version of Rails, make test/rails a symlink to that ver To run with an alternate version of Haml & Sass, make test/haml a symlink to that version. END +Rake::TestTask.new :units do |t| + t.libs << 'lib' + t.libs << 'test' + test_files = FileList['test/units/**/*_test.rb'] + test_files.exclude('test/rails/*', 'test/haml/*') + t.test_files = test_files + t.verbose = true +end + + desc "Compile Examples into HTML and CSS" task :examples do linked_haml = "tests/haml" diff --git a/lib/compass/commands/sprite.rb b/lib/compass/commands/sprite.rb index b93705ed..08b4afda 100644 --- a/lib/compass/commands/sprite.rb +++ b/lib/compass/commands/sprite.rb @@ -39,10 +39,11 @@ module Compass def perform relative_uri = options[:uri].gsub(/^#{Compass.configuration.images_dir}\//, '') - sprites = Compass::SpriteImporter.new(:uri => relative_uri, :options => Compass.sass_engine_options) - options[:output_file] ||= File.join(Compass.configuration.sass_path, "sprites", "_#{sprites.name}.#{Compass.configuration.preferred_syntax}") + name = Compass::SpriteImporter.sprite_name(relative_uri) + sprites = Compass::SpriteImporter.new + options[:output_file] ||= File.join(Compass.configuration.sass_path, "sprites", "_#{name}.#{Compass.configuration.preferred_syntax}") options[:skip_overrides] ||= false - contents = sprites.content_for_images(options[:skip_overrides]) + contents = Compass::SpriteImporter.content_for_images(relative_uri, name, options[:skip_overrides]) if options[:output_file][-4..-1] != "scss" contents = Sass::Engine.new(contents, Compass.sass_engine_options.merge(:syntax => :scss)).to_tree.to_sass end diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index d746ed28..7639f4da 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -22,7 +22,7 @@ module Compass::SassExtensions::Functions::Sprites def sprite_map(glob, kwargs = {}) kwargs.extend VariableReader Compass::SassExtensions::Sprites::SpriteMap.from_uri(glob, self, kwargs) - end + end Sass::Script::Functions.declare :sprite_map, [:glob], :var_kwargs => true # Returns the image and background position for use in a single shorthand property: diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index 546dd1d1..0ca769d0 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -12,11 +12,13 @@ module Compass # Initialize a new sprite object from a relative file path # the path is relative to the images_path confguration option def self.from_uri(uri, context, kwargs) - importer = ::Compass::SpriteImporter.new(:uri => uri.value, :options => {}) - sprites = importer.files.map do |sprite| - sprite.gsub(Compass.configuration.images_path+"/", "") + uri = uri.value + name, path = Compass::SpriteImporter.path_and_name(uri) + files = Compass::SpriteImporter.files(uri) + sprites = files.map do |sprite| + sprite.gsub("#{Compass.configuration.images_path}/", "") end - new(sprites, importer.path, importer.name, context, kwargs) + new(sprites, path, name, context, kwargs) end def initialize(sprites, path, name, context, kwargs) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 3dd1bd3e..e596e9a7 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -1,6 +1,5 @@ module Compass class SpriteImporter < Sass::Importers::Base - attr_accessor :uri, :options VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/ SPRITE_IMPORTER_REGEX = %r{((.+/)?([^\*.]+))/(.+?)\.png} VALID_EXTENSIONS = ['.png'] @@ -11,29 +10,15 @@ module Compass glob = "*-{,s}#{hex*10}{#{VALID_EXTENSIONS.join(",")}}" Dir.glob(File.join(path, "**", glob)) end - - def self.load(uri, options) - klass = Compass::SpriteImporter.new - klass.uri, klass.options = uri, options - klass - end - - def initialize(options ={}) - @uri, @options = '', {} - options.each do |key, value| - send("#{key}=", value) - end - end def find(uri, options) - @uri, @options = uri, options if uri =~ SPRITE_IMPORTER_REGEX - return sass_engine + return self.class.sass_engine(uri, self.class.sprite_name(uri), self, options) end + nil end def find_relative(uri, base, options) - @uri, @options = uri, options find(File.join(base, uri), options) end @@ -50,45 +35,43 @@ module Compass end def mtime(uri, options) - @uri, @options = uri, options - files.sort.inject(Time.at(0)) do |max_time, file| + self.class.files(uri).sort.inject(Time.at(0)) do |max_time, file| (t = File.mtime(file)) > max_time ? t : max_time end end def key(uri, options={}) - @uri, @options = uri, options - [self.class.name + ":" + File.dirname(File.expand_path(uri)), File.basename(uri)] + [self.class.name + ":sprite:" + File.dirname(File.expand_path(uri)), File.basename(uri)] end def self.path_and_name(uri) if uri =~ SPRITE_IMPORTER_REGEX [$1, $3] else - raise Compass::Error "invalid sprite path" + raise Compass::Error, "invalid sprite path" end end # Name of this spite - def name - ensure_path_and_name! - @name + def self.sprite_name(uri) + _, name = path_and_name(uri) + name end # The on-disk location of this sprite - def path - ensure_path_and_name! - @path + def self.path(uri) + path, _ = path_and_name(uri) + path end - # Returns the Glob of image files for this sprite - def files + # Returns the Glob of image files for the uri + def self.files(uri) Dir[File.join(Compass.configuration.images_path, uri)].sort end # Returns an Array of image names without the file extension - def sprite_names - files.collect do |file| + def self.sprite_names(uri) + files(uri).collect do |file| filename = File.basename(file, '.png') unless VAILD_FILE_NAME =~ filename raise Compass::Error, "Sprite file names must be legal css identifiers. Please rename #{File.basename(file)}" @@ -97,31 +80,18 @@ module Compass end end - def validate_sprites! - files.each do |file| - unless VALID_EXTENSIONS.include? File.extname(file) - raise Compass::Error, "Invalid sprite extension only: #{VALID_EXTENSIONS.join(',')} images are allowed" - end - end - end - - # Returns the sass options for this sprite - def sass_options - options.merge(:filename => name, :syntax => :scss, :importer => self) + # Returns the sass _options for this sprite + def self.sass_options(name, importer, options) + options.merge!(:filename => name, :syntax => :scss, :importer => importer) end # Returns a Sass::Engine for this sprite object - def sass_engine - validate_sprites! - Sass::Engine.new(content_for_images, sass_options) + def self.sass_engine(uri, name, importer, options) + Sass::Engine.new(content_for_images(uri, name, options[:skip_overrides]), sass_options(name, importer, options)) end - - def ensure_path_and_name! - @path, @name = self.class.path_and_name(uri) - end # Generates the Sass for this sprite file - def content_for_images(skip_overrides = false) + def self.content_for_images(uri, name, skip_overrides = false) <<-SCSS @import "compass/utilities/sprites/base"; @@ -135,7 +105,7 @@ $#{name}-repeat: no-repeat !default; $#{name}-prefix: '' !default; $#{name}-clean-up: true !default; -#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides } +#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) } // All sprites should extend this class // The #{name}-sprite mixin will do so for you. @@ -167,7 +137,7 @@ $#{name}-clean-up: true !default; // Generates a class for each sprited image. @mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) { - @include #{name}-sprites(#{sprite_names.join(" ")}, $dimensions, $prefix); + @include #{name}-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix); } SCSS end @@ -176,12 +146,13 @@ SCSS # $#{name}-#{sprite_name}-position # $#{name}-#{sprite_name}-spacing # #{name}-#{sprite_name}-repeat: - def generate_overrides + def self.generate_overrides(uri, name) + sprites = sprite_names(uri) content = <<-TXT // These variables control the generated sprite output // You can override them selectively before you import this file. TXT - sprite_names.map do |sprite_name| + sprites.map do |sprite_name| content += <<-SCSS $#{name}-#{sprite_name}-position: $#{name}-position !default; $#{name}-#{sprite_name}-spacing: $#{name}-spacing !default; @@ -190,7 +161,7 @@ $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default; end.join content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$cleanup: $#{name}-clean-up,\n" - content += sprite_names.map do |sprite_name| + content += sprites.map do |sprite_name| %Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position, $#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing, $#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat} diff --git a/test/test_helper.rb b/test/test_helper.rb index 33dbe6ec..df9edc22 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -34,4 +34,17 @@ class Test::Unit::TestCase include Compass::IoHelper extend Compass::TestCaseHelper::ClassMethods -end \ No newline at end of file +end + +module SpriteHelper + URI = "selectors/*.png" + + def test_sprite_map(options) + importer = Compass::SpriteImporter.new + path, name = Compass::SpriteImporter.path_and_name(URI) + sprite_names = Compass::SpriteImporter.sprite_names(URI) + sass_engine = Compass::SpriteImporter.sass_engine(URI, name, importer, options) + Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options) + end + +end \ No newline at end of file diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index aa8dff32..8fb80ff1 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -1,9 +1,9 @@ require 'test_helper' require 'mocha' require 'ostruct' + class SpritesImageTest < Test::Unit::TestCase - - + include SpriteHelper def setup @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') file = StringIO.new("images_path = #{@images_src_path.inspect}\n") @@ -18,12 +18,8 @@ class SpritesImageTest < Test::Unit::TestCase let(:sprite_path) { File.join(@images_src_path, sprite_filename) } let(:sprite_name) { File.basename(sprite_filename, '.png') } - def parent - importer = Compass::SpriteImporter.new(:uri => "selectors/*.png", :options => options) - @parent ||= Compass::SassExtensions::Sprites::SpriteMap.new(importer.sprite_names.map{|n| "selectors/#{n}.png"}, importer.path, importer.name, importer.sass_engine, importer.options) - end - let(:options) do + def options options = {:offset => @offset} options.stubs(:get_var).with(anything).returns(nil) ::OpenStruct.any_instance.stubs(:unitless?).returns(true) @@ -38,7 +34,7 @@ class SpritesImageTest < Test::Unit::TestCase let(:digest) { Digest::MD5.file(sprite_path).hexdigest } - let(:image) { Compass::SassExtensions::Sprites::Image.new(parent, File.join(sprite_filename), options)} + let(:image) { Compass::SassExtensions::Sprites::Image.new(test_sprite_map(options), File.join(sprite_filename), options)} test 'initialize' do assert_equal sprite_name, image.name diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index 79fdc800..571455d2 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -7,7 +7,7 @@ class ImporterTest < Test::Unit::TestCase @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') file = StringIO.new("images_path = #{@images_src_path.inspect}\n") Compass.add_configuration(file, "sprite_config") - @importer = Compass::SpriteImporter.new(:uri => URI, :options => options) + @importer = Compass::SpriteImporter.new end def teardown @@ -18,20 +18,16 @@ class ImporterTest < Test::Unit::TestCase {:foo => 'bar'} end - test "load should return an instance of SpriteImporter" do - assert Compass::SpriteImporter.load(URI, options).is_a?(Compass::SpriteImporter) - end - test "name should return the sprite name" do - assert_equal 'selectors', @importer.name + assert_equal 'selectors', Compass::SpriteImporter.sprite_name(URI) end test "path should return the sprite path" do - assert_equal 'selectors', @importer.path + assert_equal 'selectors', Compass::SpriteImporter.path(URI) end test "should return all the sprite names" do - assert_equal ["ten-by-ten", "ten-by-ten_active", "ten-by-ten_hover", "ten-by-ten_target"], @importer.sprite_names + assert_equal ["ten-by-ten", "ten-by-ten_active", "ten-by-ten_hover", "ten-by-ten_target"], Compass::SpriteImporter.sprite_names(URI) end test "should have correct mtime" do @@ -47,19 +43,21 @@ class ImporterTest < Test::Unit::TestCase end test "sass options should contain options" do - assert_equal 'bar', @importer.sass_options[:foo] + opts = Compass::SpriteImporter.sass_options(name, @importer, options) + assert_equal 'bar', opts[:foo] end test "should fail given bad sprite extensions" do @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') file = StringIO.new("images_path = #{@images_src_path.inspect}\n") Compass.add_configuration(file, "sprite_config") - importer = Compass::SpriteImporter.new(:uri => 'bad_extensions/*.jpg', :options => options) + importer = Compass::SpriteImporter.new + uri = "bad_extensions/*.jpg" begin - importer.sass_engine + Compass::SpriteImporter.sass_engine(uri, Compass::SpriteImporter.sprite_name(uri), importer, {}) assert false, "An invalid sprite file made it past validation." rescue Compass::Error => e - assert e.message.include?('.png') + assert e.message.include?("invalid sprite path") end end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 56f10885..5c488a59 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -1,6 +1,7 @@ require 'test_helper' class SpriteMapTest < Test::Unit::TestCase + include SpriteHelper def setup Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader) @@ -12,16 +13,12 @@ class SpriteMapTest < Test::Unit::TestCase Compass.add_configuration(config) Compass.configure_sass_plugin! @options = {'cleanup' => Sass::Script::Bool.new(true)} - setup_map - end - - def setup_map - @importer = Compass::SpriteImporter.new(:uri => "selectors/*.png", :options => @options) - @base = Compass::SassExtensions::Sprites::SpriteMap.new(@importer.sprite_names.map{|n| "selectors/#{n}.png"}, @importer.path, @importer.name, @importer.sass_engine, @importer.options) + @base = test_sprite_map(@options) end def teardown FileUtils.rm_r @images_tmp_path + @base = nil end it "should have the correct size" do @@ -29,7 +26,7 @@ class SpriteMapTest < Test::Unit::TestCase end it "should have the sprite names" do - assert_equal @importer.sprite_names, @base.sprite_names + assert_equal Compass::SpriteImporter.sprite_names(URI), @base.sprite_names end it 'should have image filenames' do @@ -82,7 +79,7 @@ class SpriteMapTest < Test::Unit::TestCase file_to_remove = File.join(@images_tmp_path, 'selectors', 'ten-by-ten.png') FileUtils.rm file_to_remove assert !File.exists?(file_to_remove), "Failed to remove sprite file" - setup_map + @base = test_sprite_map(@options) @base.generate assert !File.exists?(file), "Sprite file did not get removed" end From e0abb38e2fb52cfe6a1e3aa68e89b70d249fb05e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 19 Jun 2011 11:24:44 -0400 Subject: [PATCH 011/290] fixed problem with decimal math and being able to position sprites with "%"s fixes #415 --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index c620e95a..539d1d22 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -38,7 +38,7 @@ module Compass # collects image sizes and input parameters for each sprite def compute_image_positions! @images.each_with_index do |image, index| - image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100) : image.position.value + image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value next if index == 0 last_image = @images[index-1] image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max From 1178c940bb0937cecccf7732c5da7dcc84e049de Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 19 Jun 2011 12:26:38 -0400 Subject: [PATCH 012/290] fixed tests --- test/test_helper.rb | 2 +- test/units/sprites/image_test.rb | 2 +- test/units/sprites/importer_test.rb | 2 +- test/units/sprites/sprite_map_test.rb | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index df9edc22..a4146cc6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -39,7 +39,7 @@ end module SpriteHelper URI = "selectors/*.png" - def test_sprite_map(options) + def sprite_map_test(options) importer = Compass::SpriteImporter.new path, name = Compass::SpriteImporter.path_and_name(URI) sprite_names = Compass::SpriteImporter.sprite_names(URI) diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index 8fb80ff1..6caef387 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -34,7 +34,7 @@ class SpritesImageTest < Test::Unit::TestCase let(:digest) { Digest::MD5.file(sprite_path).hexdigest } - let(:image) { Compass::SassExtensions::Sprites::Image.new(test_sprite_map(options), File.join(sprite_filename), options)} + let(:image) { Compass::SassExtensions::Sprites::Image.new(sprite_map_test(options), File.join(sprite_filename), options)} test 'initialize' do assert_equal sprite_name, image.name diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index 571455d2..f9b0d79d 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -43,7 +43,7 @@ class ImporterTest < Test::Unit::TestCase end test "sass options should contain options" do - opts = Compass::SpriteImporter.sass_options(name, @importer, options) + opts = Compass::SpriteImporter.sass_options('foo', @importer, options) assert_equal 'bar', opts[:foo] end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 5c488a59..8abb762e 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -13,7 +13,7 @@ class SpriteMapTest < Test::Unit::TestCase Compass.add_configuration(config) Compass.configure_sass_plugin! @options = {'cleanup' => Sass::Script::Bool.new(true)} - @base = test_sprite_map(@options) + @base = sprite_map_test(@options) end def teardown @@ -79,7 +79,7 @@ class SpriteMapTest < Test::Unit::TestCase file_to_remove = File.join(@images_tmp_path, 'selectors', 'ten-by-ten.png') FileUtils.rm file_to_remove assert !File.exists?(file_to_remove), "Failed to remove sprite file" - @base = test_sprite_map(@options) + @base = sprite_map_test(@options) @base.generate assert !File.exists?(file), "Sprite file did not get removed" end From 8d2ad57e186ac7b480c7337d2688cffe4be035b9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 23 Jun 2011 06:32:41 -0700 Subject: [PATCH 013/290] Thanks @ngauthier for spellchecking! --- lib/compass/app_integration/rails.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb index 06bc7764..dcd1b0e2 100644 --- a/lib/compass/app_integration/rails.rb +++ b/lib/compass/app_integration/rails.rb @@ -50,7 +50,7 @@ module Compass def initialize!(config = nil) if booted? - Compass::Util.compass_warn("Warning: Compass was booted twice. Compass has a Railtie now; please remove your intializer.") + Compass::Util.compass_warn("Warning: Compass was booted twice. Compass has a Railtie now; please remove your initializer.") else booted! end From 18c79f51a24a60e69bfce94b258cfaa723fb90b7 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 25 Jun 2011 01:23:50 -0400 Subject: [PATCH 014/290] horizontal sprite layout --- lib/compass/sass_extensions/sprites.rb | 1 + .../sass_extensions/sprites/layout_methods.rb | 85 +++++++++++++++++++ .../sass_extensions/sprites/sprite_map.rb | 2 + .../sass_extensions/sprites/sprite_methods.rb | 13 --- 4 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 lib/compass/sass_extensions/sprites/layout_methods.rb diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb index ab35d84e..246836a7 100644 --- a/lib/compass/sass_extensions/sprites.rb +++ b/lib/compass/sass_extensions/sprites.rb @@ -9,6 +9,7 @@ module Compass end require 'compass/sass_extensions/sprites/image' +require 'compass/sass_extensions/sprites/layout_methods' require 'compass/sass_extensions/sprites/sprite_methods' require 'compass/sass_extensions/sprites/image_methods' require 'compass/sass_extensions/sprites/sprite_map' diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb new file mode 100644 index 00000000..d8787671 --- /dev/null +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -0,0 +1,85 @@ +module Compass + module SassExtensions + module Sprites + module LayoutMethods + HORIZONTAL = 'horizontal' + + def horizontal? + @kwargs.get_var('layout').value == HORIZONTAL + end + + # Calculates the overal image dimensions + # collects image sizes and input parameters for each sprite + def compute_image_positions! + if horizontal? + calculate_height + calculate_horizontal_positions + calculate_width + else + calculate_width + calulate_vertical_postions + calculate_height + end + end + + def calculate_horizontal_positions + @images.each_with_index do |image, index| + image.top = image.position.unit_str == '%' ? (@height - image.height) * (image.position.value / 100.0) : image.position.value + next if index == 0 + last_image = @images[index-1] + image.left = last_image.left + last_image.width + [image.offset, last_image.offset].max + end + end + + def calulate_vertical_postions + @images.each_with_index do |image, index| + image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value + next if index == 0 + last_image = @images[index-1] + image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max + end + end + + + def calculate_dimensions! + calculate_width + calculate_height + end + + def calculate_height + @height = if horizontal? + height_for_horizontal_layout + else + height_for_vertical_layout + end + end + + def height_for_vertical_layout + last = @images.last + last.top + last.height + end + + def height_for_horizontal_layout + @height = @images.map {|image| image.height + image.spacing}.max + end + + def calculate_width + @width = if horizontal? + width_for_horizontal_layout + else + width_for_vertical_layout + end + end + + def width_for_horizontal_layout + @images.inject(0) { |sum, image| sum += (image.width + image.offset) } + end + + def width_for_vertical_layout + @images.map { |image| image.width + image.offset }.max + end + end + end + end +end + \ No newline at end of file diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index 0ca769d0..aa9179a1 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -7,6 +7,7 @@ module Compass include SpriteMethods include ImageMethods + include LayoutMethods # Initialize a new sprite object from a relative file path @@ -27,6 +28,7 @@ module Compass @name = name @kwargs = kwargs @kwargs['cleanup'] ||= Sass::Script::Bool.new(true) + @kwargs['layout'] ||= Sass::Script::String.new('vertical') @images = nil @width = nil @height = nil diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 539d1d22..7fdec149 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -14,7 +14,6 @@ module Compass @width = 0 init_images compute_image_positions! - @height = @images.last.top + @images.last.height init_engine end @@ -29,22 +28,10 @@ module Compass def init_images @images = image_names.collect do |relative_file| image = Compass::SassExtensions::Sprites::Image.new(self, relative_file, kwargs) - @width = [ @width, image.width + image.offset ].max image end end - # Calculates the overal image dimensions - # collects image sizes and input parameters for each sprite - def compute_image_positions! - @images.each_with_index do |image, index| - image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value - next if index == 0 - last_image = @images[index-1] - image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max - end - end - # Validates that the sprite_names are valid sass def validate! for sprite_name in sprite_names From 43868ecabd856b812f805ac7bb983f47c94f8d0f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 25 Jun 2011 01:28:01 -0400 Subject: [PATCH 015/290] test files for horizontal sprites --- lib/compass/sprite_importer.rb | 5 ++-- test/integrations/sprites_test.rb | 30 ++++++++++++++++++++++- test/units/sprites/image_test.rb | 1 + test/units/sprites/sprite_map_test.rb | 34 ++++++++++++++++++++++++++- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index e596e9a7..d46403d9 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -104,8 +104,9 @@ $#{name}-spacing: 0 !default; $#{name}-repeat: no-repeat !default; $#{name}-prefix: '' !default; $#{name}-clean-up: true !default; +$#{name}-layout:vertical !default; -#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) } +#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $layout: $#{name}-layout, $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) } // All sprites should extend this class // The #{name}-sprite mixin will do so for you. @@ -160,7 +161,7 @@ $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default; SCSS end.join - content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$cleanup: $#{name}-clean-up,\n" + content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$layout: $#{name}-layout, \n$cleanup: $#{name}-clean-up,\n" content += sprites.map do |sprite_name| %Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position, $#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing, diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 723dac7d..456b0063 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -603,5 +603,33 @@ class SpritesTest < Test::Unit::TestCase } CSS end + + it "should calculate corret sprite demsions when givin spacing via issue#253" do + css = render <<-SCSS + $squares-layout:horizontal; + @import "squares/*.png"; + .foo { + @include sprite-background-position($squares-sprites, "twenty-by-twenty"); + } + .bar { + @include sprite-background-position($squares-sprites, "ten-by-ten"); + } + SCSS + assert_equal [30, 20], image_size('squares-s*.png') + other_css = <<-CSS + .squares-sprite { + background: url('/squares-s161c60ad78.png') no-repeat; + } -end \ No newline at end of file + .foo { + background-position: -10px 0; + } + + .bar { + background-position: 0 0; + } + CSS + assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + end + +end diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index 6caef387..afcc0c7c 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -26,6 +26,7 @@ class SpritesImageTest < Test::Unit::TestCase options.stubs(:get_var).with("#{sprite_name}-repeat").returns(::OpenStruct.new(:value => @repeat)) options.stubs(:get_var).with("#{sprite_name}-spacing").returns(::OpenStruct.new(:value => @spacing)) options.stubs(:get_var).with("#{sprite_name}-position").returns(::OpenStruct.new(:value => @position)) + options.stubs(:get_var).with("layout").returns(::OpenStruct.new(:value => 'vertical')) options end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 8abb762e..9afa868a 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -12,7 +12,7 @@ class SpriteMapTest < Test::Unit::TestCase config.images_path = @images_tmp_path Compass.add_configuration(config) Compass.configure_sass_plugin! - @options = {'cleanup' => Sass::Script::Bool.new(true)} + @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')} @base = sprite_map_test(@options) end @@ -83,5 +83,37 @@ class SpriteMapTest < Test::Unit::TestCase @base.generate assert !File.exists?(file), "Sprite file did not get removed" end + + it "should have a vertical layout" do + assert_equal [0, 10, 20, 30], @base.images.map(&:top) + assert_equal [0, 0, 0, 0], @base.images.map(&:left) + end + + + # Horizontal tests + def horizontal + opts = @options.merge("layout" => Sass::Script::String.new('horizontal')) + sprite_map_test(opts) + end + + it "should have a horizontal layout" do + base = horizontal + assert_equal 10, base.height + assert_equal 40, base.width + end + + it "should layout images horizontaly" do + base = horizontal + assert_equal [0, 10, 20, 30], base.images.map(&:left) + assert_equal [0, 0, 0, 0], base.images.map(&:top) + end + + it "should generate a horrizontal sprite" do + base = horizontal + base.generate + assert File.exists?(base.filename) + FileUtils.rm base.filename + end + end \ No newline at end of file From 9da1d44d45339fc06ec60b6a43d271977bf05436 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 27 Jun 2011 00:59:08 -0400 Subject: [PATCH 016/290] merge --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 319f703a..acc0bc9c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.11.3.b352e8b) + compass (0.11.3.rails.0.642d0b2) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) From 71d8111454ec914a5e2609b7757210a01faf8d6e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 27 Jun 2011 01:21:45 -0400 Subject: [PATCH 017/290] renamed test --- Gemfile.lock | 2 +- test/integrations/sprites_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 74677031..aa586614 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.11.3.c8cb9f2) + compass (0.11.3.43868ec) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 456b0063..6f6834bd 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -604,7 +604,7 @@ class SpritesTest < Test::Unit::TestCase CSS end - it "should calculate corret sprite demsions when givin spacing via issue#253" do + it "should create horizontal sprite" do css = render <<-SCSS $squares-layout:horizontal; @import "squares/*.png"; From 7e07e55f13c37b8424c8b0ffeaa0613f22cfa153 Mon Sep 17 00:00:00 2001 From: Noah Kantrowitz Date: Thu, 30 Jun 2011 16:35:22 -0700 Subject: [PATCH 018/290] Pass through offset parameters to the :hover, :target, and :active magic sprite selectors. --- .../stylesheets/compass/utilities/sprites/_base.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss b/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss index c346e181..d40740dc 100644 --- a/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +++ b/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss @@ -30,18 +30,18 @@ $disable-magic-sprite-selectors:false !default; @include sprite-dimensions($map, $sprite); } @if not $disable-magic-sprite-selectors { - @include sprite-selectors($map, $sprite, $sprite); + @include sprite-selectors($map, $sprite, $sprite, $offset-x, $offset-y); } } // Include the selectors for the `$sprite` given the `$map` and the // `$full-sprite-name` // @private -@mixin sprite-selectors($map, $sprite-name, $full-sprite-name) { +@mixin sprite-selectors($map, $sprite-name, $full-sprite-name, $offset-x: 0, $offset-y: 0) { @each $selector in $sprite-selectors { @if sprite_has_selector($map, $sprite-name, $selector) { &:#{$selector}, &.#{$full-sprite-name}_#{$selector}, &.#{$full-sprite-name}-#{$selector} { - @include sprite-background-position($map, "#{$sprite-name}_#{$selector}"); + @include sprite-background-position($map, "#{$sprite-name}_#{$selector}", $offset-x, $offset-y); } } } From c9145a4aca4096d5c88698872b7002b10c684deb Mon Sep 17 00:00:00 2001 From: Noah Kantrowitz Date: Thu, 30 Jun 2011 18:44:19 -0700 Subject: [PATCH 019/290] Add a test for the new sprite offset passing. --- test/integrations/sprites_test.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 6f6834bd..99a7d63e 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -518,6 +518,33 @@ class SpritesTest < Test::Unit::TestCase } CSS end + + it "should render corret sprite with css selectors via magic mixin with the correct offsets" do + css = render <<-SCSS + @import "selectors/*.png"; + a { + @include selectors-sprite(ten-by-ten, false, 5, -5) + } + SCSS + assert_correct css, <<-CSS + .selectors-sprite, a { + background: url('/selectors-sedfef809e2.png') no-repeat; + } + + a { + background-position: 5px -5px; + } + a:hover, a.ten-by-ten_hover, a.ten-by-ten-hover { + background-position: 5px -25px; + } + a:target, a.ten-by-ten_target, a.ten-by-ten-target { + background-position: 5px -35px; + } + a:active, a.ten-by-ten_active, a.ten-by-ten-active { + background-position: 5px -15px; + } + CSS + end it "should raise error on filenames that are not valid sass syntax" do assert_raise(Compass::Error) do From a08d0319d03409e1619d088cef21c5781063c8b3 Mon Sep 17 00:00:00 2001 From: Caged Date: Sat, 2 Jul 2011 13:27:32 -0700 Subject: [PATCH 020/290] Fixes #449. Accept and honor offsets in selectors --- Gemfile.lock | 2 +- .../compass/utilities/sprites/_base.scss | 10 +++---- .../sass_extensions/functions/sprites.rb | 2 +- lib/compass/sprite_importer.rb | 8 ++--- test/integrations/sprites_test.rb | 30 +++++++++++++++++-- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ab6f3cba..5b86ed71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.11.3.rails.0.dfb7c70) + compass (0.11.3.rails.0.2124003) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss b/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss index c346e181..1b268a84 100644 --- a/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +++ b/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss @@ -30,18 +30,18 @@ $disable-magic-sprite-selectors:false !default; @include sprite-dimensions($map, $sprite); } @if not $disable-magic-sprite-selectors { - @include sprite-selectors($map, $sprite, $sprite); + @include sprite-selectors($map, $sprite, $sprite, $offset-x, $offset-y); } } // Include the selectors for the `$sprite` given the `$map` and the // `$full-sprite-name` // @private -@mixin sprite-selectors($map, $sprite-name, $full-sprite-name) { +@mixin sprite-selectors($map, $sprite-name, $full-sprite-name, $offset-x: 0, $offset-y: 0) { @each $selector in $sprite-selectors { @if sprite_has_selector($map, $sprite-name, $selector) { &:#{$selector}, &.#{$full-sprite-name}_#{$selector}, &.#{$full-sprite-name}-#{$selector} { - @include sprite-background-position($map, "#{$sprite-name}_#{$selector}"); + @include sprite-background-position($map, "#{$sprite-name}_#{$selector}", $offset-x, $offset-y); } } } @@ -53,13 +53,13 @@ $disable-magic-sprite-selectors:false !default; // If a base class is provided, then each class will extend it. // // If `$dimensions` is `true`, the sprite dimensions will specified. -@mixin sprites($map, $sprite-names, $base-class: false, $dimensions: false, $prefix: sprite-map-name($map)) { +@mixin sprites($map, $sprite-names, $base-class: false, $dimensions: false, $prefix: sprite-map-name($map), $offset-x: 0, $offset-y: 0) { @each $sprite-name in $sprite-names { @if sprite_does_not_have_parent($map, $sprite-name) { $full-sprite-name: "#{$prefix}-#{$sprite-name}"; .#{$full-sprite-name} { @if $base-class { @extend #{$base-class}; } - @include sprite($map, $sprite-name, $dimensions); + @include sprite($map, $sprite-name, $dimensions, $offset-x, $offset-y); } } } diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index 7639f4da..d006d3ee 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -34,7 +34,7 @@ module Compass::SassExtensions::Functions::Sprites # # background: url('/images/icons.png?12345678') 0 -24px no-repeat; def sprite(map, sprite, offset_x = ZERO, offset_y = ZERO) - sprite = convert_sprite_name(sprite) + sprite = convert_sprite_name(sprite) verify_map(map) unless sprite.is_a?(Sass::Script::String) raise Sass::SyntaxError, %Q(The second argument to sprite() must be a sprite name. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index d46403d9..1bda1162 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -132,13 +132,13 @@ $#{name}-layout:vertical !default; @include sprite($#{name}-sprites, $name, $dimensions, $offset-x, $offset-y) } -@mixin #{name}-sprites($sprite-names, $dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) { - @include sprites($#{name}-sprites, $sprite-names, $#{name}-sprite-base-class, $dimensions, $prefix) +@mixin #{name}-sprites($sprite-names, $dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites), $offset-x: 0, $offset-y: 0) { + @include sprites($#{name}-sprites, $sprite-names, $#{name}-sprite-base-class, $dimensions, $prefix, $offset-x, $offset-y) } // Generates a class for each sprited image. -@mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) { - @include #{name}-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix); +@mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites), $offset-x: 0, $offset-y: 0) { + @include #{name}-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix, $offset-x, $offset-y); } SCSS end diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 6f6834bd..9e69f703 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -448,7 +448,7 @@ class SpritesTest < Test::Unit::TestCase CSS end - it "should render corret sprite with css selectors via issue#248" do + it "should render correct sprite with css selectors via issue#248" do css = render <<-SCSS @import "selectors/*.png"; @include all-selectors-sprites; @@ -472,8 +472,33 @@ class SpritesTest < Test::Unit::TestCase } CSS end + + it "should honor offsets when rendering selectors via issue#449" do + css = render <<-SCSS + @import "selectors/*.png"; + @include all-selectors-sprites($offset-x: 20px, $offset-y: 20px); + SCSS + assert_correct css, <<-CSS + .selectors-sprite, .selectors-ten-by-ten { + background: url('/selectors-sedfef809e2.png') no-repeat; + } + + .selectors-ten-by-ten { + background-position: 20px 20px; + } + .selectors-ten-by-ten:hover, .selectors-ten-by-ten.ten-by-ten_hover, .selectors-ten-by-ten.ten-by-ten-hover { + background-position: 20px 0; + } + .selectors-ten-by-ten:target, .selectors-ten-by-ten.ten-by-ten_target, .selectors-ten-by-ten.ten-by-ten-target { + background-position: 20px -10px; + } + .selectors-ten-by-ten:active, .selectors-ten-by-ten.ten-by-ten_active, .selectors-ten-by-ten.ten-by-ten-active { + background-position: 20px 10px; + } + CSS + end - it "should render corret sprite with css selectors via magic mixin" do + it "should render correct sprite with css selectors via magic mixin" do css = render <<-SCSS @import "selectors/*.png"; a { @@ -499,6 +524,7 @@ class SpritesTest < Test::Unit::TestCase } CSS end + it "should not render corret sprite with css selectors via magic mixin" do css = render <<-SCSS From 1c65f4c52b529683b2cda9e3205d83590a1e47fb Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 2 Jul 2011 20:52:54 -0700 Subject: [PATCH 021/290] Fix gem issue --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9cbf03b4..c398a8c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -105,7 +105,7 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (~> 0.14.4) - rake (0.9.2) + rake (0.8.7) rb-fsevent (0.4.0) rcov (0.9.9) rdoc (3.6.1) From fce52690b9069e84322f3c6bcdeb2c2885b6d4ed Mon Sep 17 00:00:00 2001 From: lyuba Date: Fri, 15 Jul 2011 23:31:30 +0200 Subject: [PATCH 022/290] font weight and style default to false --- .../compass/stylesheets/compass/css3/_font-face.scss | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_font-face.scss b/frameworks/compass/stylesheets/compass/css3/_font-face.scss index cd2529e1..e3ecc8b6 100644 --- a/frameworks/compass/stylesheets/compass/css3/_font-face.scss +++ b/frameworks/compass/stylesheets/compass/css3/_font-face.scss @@ -26,8 +26,8 @@ $name, $font-files, $eot: false, - $weight: normal, - $style: normal + $weight: false, + $style: false ) { $iefont: unquote("#{$eot}?iefix"); @font-face { @@ -37,8 +37,12 @@ $font-files: font-url($iefont) unquote("format('eot')"), $font-files; } src: $font-files; - font-weight: $weight; - font-style: $style; + @if $weight { + font-weight: $weight; + } + @if $style { + font-style: $style; + } } } From 0c1342746e5e34905c0a215f4c943e0fb0b3524e Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 18 Jul 2011 22:00:06 -0700 Subject: [PATCH 023/290] Better configuration defaults for rails31 --- .../rails/configuration_defaults.rb | 20 +++++++++++++++++++ lib/compass/configuration/defaults.rb | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb index 06aaf311..2170f0f7 100644 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ b/lib/compass/app_integration/rails/configuration_defaults.rb @@ -21,6 +21,26 @@ module Compass def default_javascripts_dir File.join("app", "assets", "javascripts") end + + def default_http_path + ::Rails.application.config.assets.prefix + end + + def default_http_images_path + "#{top_level.http_path}" + end + + def default_http_javascripts_path + "#{top_level.http_path}" + end + + def default_http_fonts_path + "#{top_level.http_path}" + end + + def default_http_stylesheets_path + "#{top_level.http_path}" + end end module ConfigurationDefaults diff --git a/lib/compass/configuration/defaults.rb b/lib/compass/configuration/defaults.rb index 236ce672..403b185c 100644 --- a/lib/compass/configuration/defaults.rb +++ b/lib/compass/configuration/defaults.rb @@ -10,7 +10,7 @@ module Compass :stand_alone end - def http_path_without_default + def default_http_path "/" end From 98350c3e19e5aae359a15201e99b9ee5b4503c93 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 19 Jul 2011 12:32:26 -0400 Subject: [PATCH 024/290] fixed a nil bug in the latest ruby 1.9.2 --- lib/compass/actions.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/actions.rb b/lib/compass/actions.rb index 4e924f1b..288e3370 100644 --- a/lib/compass/actions.rb +++ b/lib/compass/actions.rb @@ -65,6 +65,7 @@ module Compass end def remove(file_name) + file_name ||= '' if File.directory?(file_name) FileUtils.rm_rf file_name log_action :remove, basename(file_name)+"/", options From 400623f4ebcc3235e02625765cfb1af08c128753 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 19 Jul 2011 12:34:05 -0400 Subject: [PATCH 025/290] removed string compairson in configuration tests it was compairing comments which is unneeded when also testing for proper values --- test/units/configuration_test.rb | 83 +------------------------------- 1 file changed, 2 insertions(+), 81 deletions(-) diff --git a/test/units/configuration_test.rb b/test/units/configuration_test.rb index 792df86d..cf011bb5 100644 --- a/test/units/configuration_test.rb +++ b/test/units/configuration_test.rb @@ -101,31 +101,11 @@ class ConfigurationTest < Test::Unit::TestCase plugin_opts = Compass.configuration.to_sass_plugin_options - assert load_paths.include?("/home/chris/my_compass_project/../foo") + assert load_paths.include?("/home/chris/foo"), load_paths.inspect assert load_paths.include?("/path/to/my/framework"), load_paths.inspect assert_equal "/home/chris/my_compass_project/css/framework", plugin_opts[:template_location].find{|s,c| s == "/path/to/my/framework"}[1] assert_equal "/home/chris/my_compass_project/css/foo", plugin_opts[:template_location].find{|s,c| s == "/home/chris/my_compass_project/../foo"}[1] - - expected_serialization = <\"bar\"} - -# To disable debugging comments that display the original location of your selectors. Uncomment: -# line_comments = false - -EXPECTED - - assert_correct(expected_serialization, Compass.configuration.serialize) end def test_strip_trailing_directory_separators @@ -241,26 +182,6 @@ EXPECTED Compass.add_configuration(contents, "test_strip_trailing_directory_separators") assert_equal "baz", Compass.configuration.foobar - expected_serialization = < Date: Tue, 19 Jul 2011 11:44:14 -0700 Subject: [PATCH 026/290] Revert "removed string compairson in configuration tests it was compairing comments which is unneeded when also testing for proper values" This reverts commit 400623f4ebcc3235e02625765cfb1af08c128753. --- test/units/configuration_test.rb | 83 +++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/test/units/configuration_test.rb b/test/units/configuration_test.rb index cf011bb5..792df86d 100644 --- a/test/units/configuration_test.rb +++ b/test/units/configuration_test.rb @@ -101,11 +101,31 @@ class ConfigurationTest < Test::Unit::TestCase plugin_opts = Compass.configuration.to_sass_plugin_options - assert load_paths.include?("/home/chris/foo"), load_paths.inspect + assert load_paths.include?("/home/chris/my_compass_project/../foo") assert load_paths.include?("/path/to/my/framework"), load_paths.inspect assert_equal "/home/chris/my_compass_project/css/framework", plugin_opts[:template_location].find{|s,c| s == "/path/to/my/framework"}[1] assert_equal "/home/chris/my_compass_project/css/foo", plugin_opts[:template_location].find{|s,c| s == "/home/chris/my_compass_project/../foo"}[1] + + expected_serialization = <\"bar\"} + +# To disable debugging comments that display the original location of your selectors. Uncomment: +# line_comments = false + +EXPECTED + + assert_correct(expected_serialization, Compass.configuration.serialize) end def test_strip_trailing_directory_separators @@ -182,6 +241,26 @@ class ConfigurationTest < Test::Unit::TestCase Compass.add_configuration(contents, "test_strip_trailing_directory_separators") assert_equal "baz", Compass.configuration.foobar + expected_serialization = < Date: Tue, 19 Jul 2011 08:33:11 -0700 Subject: [PATCH 027/290] Fix broken test cases --- lib/compass/configuration/comments.rb | 6 +++++- test/units/configuration_test.rb | 7 ++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/compass/configuration/comments.rb b/lib/compass/configuration/comments.rb index 2fede24d..dcf168d1 100644 --- a/lib/compass/configuration/comments.rb +++ b/lib/compass/configuration/comments.rb @@ -4,7 +4,11 @@ module Compass module Comments def comment_for_http_path - "# Set this to the root of your project when deployed:\n" + unless top_level.http_path_without_default + "# Set this to the root of your project when deployed:\nhttp_path = #{top_level.http_path.to_s.inspect}\n" + else + "" + end end def comment_for_relative_assets diff --git a/test/units/configuration_test.rb b/test/units/configuration_test.rb index 792df86d..0ee31575 100644 --- a/test/units/configuration_test.rb +++ b/test/units/configuration_test.rb @@ -19,7 +19,6 @@ class ConfigurationTest < Test::Unit::TestCase project_type = :stand_alone - # Set this to the root of your project when deployed: http_path = "/" css_dir = "css" sass_dir = "sass" @@ -101,7 +100,7 @@ class ConfigurationTest < Test::Unit::TestCase plugin_opts = Compass.configuration.to_sass_plugin_options - assert load_paths.include?("/home/chris/my_compass_project/../foo") + assert load_paths.include?("/home/chris/foo"), "Expected to find /home/chris/foo in #{load_paths.inspect}" assert load_paths.include?("/path/to/my/framework"), load_paths.inspect assert_equal "/home/chris/my_compass_project/css/framework", plugin_opts[:template_location].find{|s,c| s == "/path/to/my/framework"}[1] assert_equal "/home/chris/my_compass_project/css/foo", plugin_opts[:template_location].find{|s,c| s == "/home/chris/my_compass_project/../foo"}[1] @@ -110,7 +109,6 @@ class ConfigurationTest < Test::Unit::TestCase # Require any additional compass plugins here. project_path = "/home/chris/my_compass_project" -# Set this to the root of your project when deployed: http_path = "/" css_dir = "css" @@ -141,7 +139,7 @@ EXPECTED load_paths = load_paths_as_strings(Compass.configuration.to_sass_engine_options[:load_paths]) - assert load_paths.include?("/home/chris/my_compass_project/../foo") + assert load_paths.include?("/home/chris/foo"), "Expected to find /home/chris/foo in #{load_paths.inspect}" assert load_paths.include?("/path/to/my/framework"), load_paths.inspect assert_equal "/home/chris/my_compass_project/css/framework", Compass.configuration.to_sass_plugin_options[:template_location].find{|s,c| s == "/path/to/my/framework"}[1] assert_equal "/home/chris/my_compass_project/css/foo", Compass.configuration.to_sass_plugin_options[:template_location].find{|s,c| s == "/home/chris/my_compass_project/../foo"}[1] @@ -150,7 +148,6 @@ EXPECTED # Require any additional compass plugins here. project_path = "/home/chris/my_compass_project" -# Set this to the root of your project when deployed: http_path = "/" css_dir = "css" From b1b6273b3fa5f88a80f3b3ef64e5742704e95f2b Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 21 Jul 2011 13:07:32 -0400 Subject: [PATCH 028/290] docs for horizontal spriting --- doc-src/content/help/tutorials/spriting.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 82874aef..6a5b9ad7 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -52,6 +52,14 @@ simple naming convention for your sprites so that you they are easy to remember should never have to care what the is name of the generated sprite map, nor where a sprite is located within it. + +## Layout Control + +If you prefer horizontal sprites to the `vertical` default just set the magic variable `$-layout` variable. + + $icon-layout:horizontal; + @import "icon/*.png"; + ## Selector Control From 33263caffe5548a64253976c0a034afe1ed567f4 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 22 Jul 2011 10:55:06 -0700 Subject: [PATCH 029/290] Don't nuke the css files due to config changes during rails boot unless compilation is enabled. --- lib/compass/app_integration/rails.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb index a850d8d7..1671f7f4 100644 --- a/lib/compass/app_integration/rails.rb +++ b/lib/compass/app_integration/rails.rb @@ -58,6 +58,16 @@ module Compass end end + def sass_plugin_enabled? + unless Sass::Util.ap_geq?('3.1.0.beta') + defined?(Sass::Plugin) && !Sass::Plugin.options[:never_update] + end + end + + def rails_compilation_enabled? + Sass::Util.ap_geq?('3.1.0.beta') && defined?(Sass::Rails) # XXX check if there's some other way(s) to disable the asset pipeline. + end + # Rails 2.x projects use this in their compass initializer. def initialize!(config = nil) check_for_double_boot! @@ -65,7 +75,7 @@ module Compass Compass.add_project_configuration(config, :project_type => :rails) Compass.discover_extensions! Compass.configure_sass_plugin! - Compass.handle_configuration_change! + Compass.handle_configuration_change! if sass_plugin_enabled? || rails_compilation_enabled? end end end From 7a183754b73ff7a88c0414ac1852322cbc68b059 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 25 Jul 2011 23:05:37 -0400 Subject: [PATCH 030/290] merge 454 closes 454 --- Gemfile.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5b86ed71..c36c84da 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.11.3.rails.0.2124003) + compass (0.12.0.alpha.0.38cf0e5) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -105,7 +105,7 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (~> 0.14.4) - rake (0.9.2) + rake (0.8.7) rb-fsevent (0.4.0) rcov (0.9.9) rdoc (3.6.1) @@ -147,6 +147,7 @@ DEPENDENCIES livereload mocha rails (~> 3.0.0.rc) + rake (= 0.8.7) rb-fsevent rcov rspec (~> 2.0.0) From b581d2e1a7720df5e812730a3232c4834b409498 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 02:03:38 -0400 Subject: [PATCH 031/290] passing tests for new vertical layout based on file size --- Gemfile.lock | 2 +- .../sass_extensions/sprites/layout_methods.rb | 1 + lib/compass/sprite_importer.rb | 2 +- .../stylesheets/compass/css/sprites.css | 1416 ++++++++--------- .../compass/images/flag-s03c3b29b35.png | Bin 105539 -> 0 bytes test/units/sprites/sprite_map_test.rb | 6 + 6 files changed, 717 insertions(+), 710 deletions(-) delete mode 100644 test/fixtures/stylesheets/compass/images/flag-s03c3b29b35.png diff --git a/Gemfile.lock b/Gemfile.lock index c36c84da..c2b5e59e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.12.0.alpha.0.38cf0e5) + compass (0.12.0.alpha.0.7a18375) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index d8787671..48235588 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -16,6 +16,7 @@ module Compass calculate_horizontal_positions calculate_width else + @images.sort! {|a,b| File.size(b.file) <=> File.size(a.file)} #put small images first calculate_width calulate_vertical_postions calculate_height diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 1bda1162..5eb31be2 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -80,7 +80,7 @@ module Compass end end - # Returns the sass _options for this sprite + # Returns the sass_options for this sprite def self.sass_options(name, importer, options) options.merge!(:filename => name, :syntax => :scss, :importer => importer) end diff --git a/test/fixtures/stylesheets/compass/css/sprites.css b/test/fixtures/stylesheets/compass/css/sprites.css index c31df2fa..3fc49c14 100644 --- a/test/fixtures/stylesheets/compass/css/sprites.css +++ b/test/fixtures/stylesheets/compass/css/sprites.css @@ -1,243 +1,243 @@ .flag-sprite, #flags .us, #flags .au, #flags .ca, #flags .es, #flags .eg, #flags .ly, .flag-ad, .flag-ae, .flag-af, .flag-ag, .flag-ai, .flag-al, .flag-am, .flag-an, .flag-ao, .flag-ar, .flag-as, .flag-at, .flag-au, .flag-aw, .flag-ax, .flag-az, .flag-ba, .flag-bb, .flag-bd, .flag-be, .flag-bf, .flag-bg, .flag-bh, .flag-bi, .flag-bj, .flag-bm, .flag-bn, .flag-bo, .flag-br, .flag-bs, .flag-bt, .flag-bv, .flag-bw, .flag-by, .flag-bz, .flag-ca, .flag-catalonia, .flag-cc, .flag-cd, .flag-cf, .flag-cg, .flag-ch, .flag-ci, .flag-ck, .flag-cl, .flag-cm, .flag-cn, .flag-co, .flag-cr, .flag-cs, .flag-cu, .flag-cv, .flag-cx, .flag-cy, .flag-cz, .flag-de, .flag-dj, .flag-dk, .flag-dm, .flag-do, .flag-dz, .flag-ec, .flag-ee, .flag-eg, .flag-eh, .flag-england, .flag-er, .flag-es, .flag-et, .flag-europeanunion, .flag-fam, .flag-fi, .flag-fj, .flag-fk, .flag-fm, .flag-fo, .flag-fr, .flag-ga, .flag-gb, .flag-gd, .flag-ge, .flag-gf, .flag-gh, .flag-gi, .flag-gl, .flag-gm, .flag-gn, .flag-gp, .flag-gq, .flag-gr, .flag-gs, .flag-gt, .flag-gu, .flag-gw, .flag-gy, .flag-hk, .flag-hm, .flag-hn, .flag-hr, .flag-ht, .flag-hu, .flag-id-2, .flag-ie, .flag-il, .flag-in, .flag-io, .flag-iq, .flag-ir, .flag-is, .flag-it, .flag-jm, .flag-jo, .flag-jp, .flag-ke, .flag-kg, .flag-kh, .flag-ki, .flag-km, .flag-kn, .flag-kp, .flag-kr, .flag-kw, .flag-ky, .flag-kz, .flag-la, .flag-lb, .flag-lc, .flag-li, .flag-lk, .flag-lr, .flag-ls, .flag-lt, .flag-lu, .flag-lv, .flag-ly, .flag-ma, .flag-mc, .flag-md, .flag-me, .flag-mg, .flag-mh, .flag-mk, .flag-ml, .flag-mm, .flag-mn, .flag-mo, .flag-mp, .flag-mq, .flag-mr, .flag-ms, .flag-mt, .flag-mu, .flag-mv, .flag-mw, .flag-mx, .flag-my, .flag-mz, .flag-na, .flag-nc, .flag-ne, .flag-nf, .flag-ng, .flag-ni, .flag-nl, .flag-no, .flag-np, .flag-nr, .flag-nu, .flag-nz, .flag-om, .flag-pa, .flag-pe, .flag-pf, .flag-pg, .flag-ph, .flag-pk, .flag-pl, .flag-pm, .flag-pn, .flag-pr, .flag-ps, .flag-pt, .flag-pw, .flag-py, .flag-qa, .flag-re, .flag-ro, .flag-rs, .flag-ru, .flag-rw, .flag-sa, .flag-sb, .flag-sc, .flag-scotland, .flag-sd, .flag-se, .flag-sg, .flag-sh, .flag-si, .flag-sj, .flag-sk, .flag-sl, .flag-sm, .flag-sn, .flag-so, .flag-sr, .flag-st, .flag-sv, .flag-sy, .flag-sz, .flag-tc, .flag-td, .flag-tf, .flag-tg, .flag-th, .flag-tj, .flag-tk, .flag-tl, .flag-tm, .flag-tn, .flag-to, .flag-tr, .flag-tt, .flag-tv, .flag-tw, .flag-tz, .flag-ua, .flag-ug, .flag-um, .flag-us, .flag-uy, .flag-uz, .flag-va, .flag-vc, .flag-ve, .flag-vg, .flag-vi, .flag-vn, .flag-vu, .flag-wales, .flag-wf, .flag-ws, .flag-ye, .flag-yt, .flag-za, .flag-zm, .flag-zw { - background: url('/images/flag-s03c3b29b35.png') no-repeat; } + background: url('/images/flag-s8c3c755a68.png') no-repeat; } #flags .us { - background-position: 0 -2520px; + background-position: 0 -407px; height: 11px; width: 16px; } #flags .au { - background-position: 0 -132px; + background-position: 0 -11px; height: 11px; width: 16px; } #flags .ca { - background-position: 0 -385px; + background-position: 0 -572px; height: 11px; width: 16px; } #flags .es { - background-position: 0 -737px; + background-position: 0 -2124px; height: 11px; width: 16px; } #flags .eg { - background-position: 0 -693px; + background-position: 0 -2058px; height: 11px; width: 16px; } #flags .ly { - background-position: 0 -1474px; + background-position: 0 -2663px; height: 11px; width: 16px; } .flag-ad { - background-position: 0 0; + background-position: 0 -781px; height: 11px; width: 16px; } .flag-ae { - background-position: 0 -11px; + background-position: 0 -2652px; height: 11px; width: 16px; } .flag-af { - background-position: 0 -22px; + background-position: 0 -1045px; height: 11px; width: 16px; } .flag-ag { - background-position: 0 -33px; + background-position: 0 -759px; height: 11px; width: 16px; } .flag-ai { - background-position: 0 -44px; - height: 11px; - width: 16px; } - -.flag-al { - background-position: 0 -55px; - height: 11px; - width: 16px; } - -.flag-am { - background-position: 0 -66px; - height: 11px; - width: 16px; } - -.flag-an { - background-position: 0 -77px; - height: 11px; - width: 16px; } - -.flag-ao { - background-position: 0 -88px; - height: 11px; - width: 16px; } - -.flag-ar { - background-position: 0 -99px; - height: 11px; - width: 16px; } - -.flag-as { - background-position: 0 -110px; - height: 11px; - width: 16px; } - -.flag-at { - background-position: 0 -121px; - height: 11px; - width: 16px; } - -.flag-au { - background-position: 0 -132px; - height: 11px; - width: 16px; } - -.flag-aw { - background-position: 0 -143px; - height: 11px; - width: 16px; } - -.flag-ax { - background-position: 0 -154px; - height: 11px; - width: 16px; } - -.flag-az { - background-position: 0 -165px; - height: 11px; - width: 16px; } - -.flag-ba { - background-position: 0 -176px; - height: 11px; - width: 16px; } - -.flag-bb { - background-position: 0 -187px; - height: 11px; - width: 16px; } - -.flag-bd { - background-position: 0 -198px; - height: 11px; - width: 16px; } - -.flag-be { - background-position: 0 -209px; - height: 11px; - width: 16px; } - -.flag-bf { - background-position: 0 -220px; - height: 11px; - width: 16px; } - -.flag-bg { - background-position: 0 -231px; - height: 11px; - width: 16px; } - -.flag-bh { - background-position: 0 -242px; - height: 11px; - width: 16px; } - -.flag-bi { - background-position: 0 -253px; - height: 11px; - width: 16px; } - -.flag-bj { - background-position: 0 -264px; - height: 11px; - width: 16px; } - -.flag-bm { - background-position: 0 -275px; - height: 11px; - width: 16px; } - -.flag-bn { - background-position: 0 -286px; - height: 11px; - width: 16px; } - -.flag-bo { background-position: 0 -297px; height: 11px; width: 16px; } -.flag-br { - background-position: 0 -308px; +.flag-al { + background-position: 0 -902px; height: 11px; width: 16px; } -.flag-bs { - background-position: 0 -319px; +.flag-am { + background-position: 0 -2300px; height: 11px; width: 16px; } -.flag-bt { - background-position: 0 -330px; +.flag-an { + background-position: 0 -1805px; height: 11px; width: 16px; } -.flag-bv { - background-position: 0 -341px; +.flag-ao { + background-position: 0 -1485px; height: 11px; width: 16px; } -.flag-bw { - background-position: 0 -352px; +.flag-ar { + background-position: 0 -1739px; height: 11px; width: 16px; } -.flag-by { - background-position: 0 -363px; +.flag-as { + background-position: 0 -121px; height: 11px; width: 16px; } -.flag-bz { - background-position: 0 -374px; +.flag-at { + background-position: 0 -2630px; height: 11px; width: 16px; } -.flag-ca { - background-position: 0 -385px; +.flag-au { + background-position: 0 -11px; height: 11px; width: 16px; } -.flag-catalonia { +.flag-aw { + background-position: 0 -1386px; + height: 11px; + width: 16px; } + +.flag-ax { + background-position: 0 -528px; + height: 11px; + width: 16px; } + +.flag-az { + background-position: 0 -1023px; + height: 11px; + width: 16px; } + +.flag-ba { + background-position: 0 -594px; + height: 11px; + width: 16px; } + +.flag-bb { + background-position: 0 -1254px; + height: 11px; + width: 16px; } + +.flag-bd { + background-position: 0 -1662px; + height: 11px; + width: 16px; } + +.flag-be { + background-position: 0 -2597px; + height: 11px; + width: 16px; } + +.flag-bf { + background-position: 0 -2168px; + height: 11px; + width: 16px; } + +.flag-bg { + background-position: 0 -2443px; + height: 11px; + width: 16px; } + +.flag-bh { + background-position: 0 -2080px; + height: 11px; + width: 16px; } + +.flag-bi { + background-position: 0 -44px; + height: 11px; + width: 16px; } + +.flag-bj { + background-position: 0 -2487px; + height: 11px; + width: 16px; } + +.flag-bm { background-position: 0 -396px; height: 11px; width: 16px; } +.flag-bn { + background-position: 0 -363px; + height: 11px; + width: 16px; } + +.flag-bo { + background-position: 0 -2179px; + height: 11px; + width: 16px; } + +.flag-br { + background-position: 0 -484px; + height: 11px; + width: 16px; } + +.flag-bs { + background-position: 0 -1408px; + height: 11px; + width: 16px; } + +.flag-bt { + background-position: 0 -605px; + height: 11px; + width: 16px; } + +.flag-bv { + background-position: 0 -1276px; + height: 11px; + width: 16px; } + +.flag-bw { + background-position: 0 -2355px; + height: 11px; + width: 16px; } + +.flag-by { + background-position: 0 -1463px; + height: 11px; + width: 16px; } + +.flag-bz { + background-position: 0 -550px; + height: 11px; + width: 16px; } + +.flag-ca { + background-position: 0 -572px; + height: 11px; + width: 16px; } + +.flag-catalonia { + background-position: 0 -2245px; + height: 11px; + width: 16px; } + .flag-cc { - background-position: 0 -407px; + background-position: 0 -451px; height: 11px; width: 16px; } .flag-cd { - background-position: 0 -418px; + background-position: 0 -638px; height: 11px; width: 16px; } .flag-cf { - background-position: 0 -429px; + background-position: 0 -748px; height: 11px; width: 16px; } .flag-cg { - background-position: 0 -440px; + background-position: 0 -1541px; height: 11px; width: 16px; } .flag-ch { - background-position: 0 -451px; + background-position: 0 -2696px; height: 11px; width: 11px; } .flag-ci { - background-position: 0 -462px; + background-position: 0 -2509px; height: 11px; width: 16px; } @@ -247,82 +247,82 @@ width: 16px; } .flag-cl { - background-position: 0 -484px; + background-position: 0 -2399px; height: 11px; width: 16px; } .flag-cm { - background-position: 0 -495px; + background-position: 0 -2069px; height: 11px; width: 16px; } .flag-cn { - background-position: 0 -506px; + background-position: 0 -2014px; height: 11px; width: 16px; } .flag-co { - background-position: 0 -517px; + background-position: 0 -2311px; height: 11px; width: 16px; } .flag-cr { - background-position: 0 -528px; + background-position: 0 -2036px; height: 11px; width: 16px; } .flag-cs { - background-position: 0 -539px; + background-position: 0 -2421px; height: 11px; width: 16px; } .flag-cu { - background-position: 0 -550px; + background-position: 0 -814px; height: 11px; width: 16px; } .flag-cv { - background-position: 0 -561px; + background-position: 0 -869px; height: 11px; width: 16px; } .flag-cx { - background-position: 0 -572px; + background-position: 0 -418px; height: 11px; width: 16px; } .flag-cy { - background-position: 0 -583px; + background-position: 0 -2190px; height: 11px; width: 16px; } .flag-cz { - background-position: 0 -594px; + background-position: 0 -1717px; height: 11px; width: 16px; } .flag-de { - background-position: 0 -605px; + background-position: 0 -1827px; height: 11px; width: 16px; } .flag-dj { - background-position: 0 -616px; + background-position: 0 -957px; height: 11px; width: 16px; } .flag-dk { - background-position: 0 -627px; + background-position: 0 -1970px; height: 11px; width: 16px; } .flag-dm { - background-position: 0 -638px; + background-position: 0 -374px; height: 11px; width: 16px; } .flag-do { - background-position: 0 -649px; + background-position: 0 -1783px; height: 11px; width: 16px; } @@ -332,322 +332,322 @@ width: 16px; } .flag-ec { - background-position: 0 -671px; + background-position: 0 -1915px; height: 11px; width: 16px; } .flag-ee { - background-position: 0 -682px; + background-position: 0 -2575px; height: 11px; width: 16px; } .flag-eg { - background-position: 0 -693px; + background-position: 0 -2058px; height: 11px; width: 16px; } .flag-eh { - background-position: 0 -704px; + background-position: 0 -1419px; height: 11px; width: 16px; } .flag-england { - background-position: 0 -715px; + background-position: 0 -1574px; height: 11px; width: 16px; } .flag-er { - background-position: 0 -726px; + background-position: 0 -429px; height: 11px; width: 16px; } .flag-es { - background-position: 0 -737px; + background-position: 0 -2124px; height: 11px; width: 16px; } .flag-et { - background-position: 0 -748px; - height: 11px; - width: 16px; } - -.flag-europeanunion { - background-position: 0 -759px; - height: 11px; - width: 16px; } - -.flag-fam { - background-position: 0 -770px; - height: 11px; - width: 16px; } - -.flag-fi { - background-position: 0 -781px; - height: 11px; - width: 16px; } - -.flag-fj { - background-position: 0 -792px; - height: 11px; - width: 16px; } - -.flag-fk { - background-position: 0 -803px; - height: 11px; - width: 16px; } - -.flag-fm { - background-position: 0 -814px; - height: 11px; - width: 16px; } - -.flag-fo { - background-position: 0 -825px; - height: 11px; - width: 16px; } - -.flag-fr { - background-position: 0 -836px; - height: 11px; - width: 16px; } - -.flag-ga { - background-position: 0 -847px; - height: 11px; - width: 16px; } - -.flag-gb { - background-position: 0 -858px; - height: 11px; - width: 16px; } - -.flag-gd { - background-position: 0 -869px; - height: 11px; - width: 16px; } - -.flag-ge { background-position: 0 -880px; height: 11px; width: 16px; } -.flag-gf { - background-position: 0 -891px; - height: 11px; - width: 16px; } - -.flag-gh { - background-position: 0 -902px; - height: 11px; - width: 16px; } - -.flag-gi { - background-position: 0 -913px; - height: 11px; - width: 16px; } - -.flag-gl { - background-position: 0 -924px; - height: 11px; - width: 16px; } - -.flag-gm { - background-position: 0 -935px; - height: 11px; - width: 16px; } - -.flag-gn { - background-position: 0 -946px; - height: 11px; - width: 16px; } - -.flag-gp { - background-position: 0 -957px; - height: 11px; - width: 16px; } - -.flag-gq { - background-position: 0 -968px; - height: 11px; - width: 16px; } - -.flag-gr { - background-position: 0 -979px; - height: 11px; - width: 16px; } - -.flag-gs { - background-position: 0 -990px; - height: 11px; - width: 16px; } - -.flag-gt { - background-position: 0 -1001px; - height: 11px; - width: 16px; } - -.flag-gu { - background-position: 0 -1012px; - height: 11px; - width: 16px; } - -.flag-gw { - background-position: 0 -1023px; - height: 11px; - width: 16px; } - -.flag-gy { - background-position: 0 -1034px; - height: 11px; - width: 16px; } - -.flag-hk { - background-position: 0 -1045px; - height: 11px; - width: 16px; } - -.flag-hm { - background-position: 0 -1056px; - height: 11px; - width: 16px; } - -.flag-hn { - background-position: 0 -1067px; - height: 11px; - width: 16px; } - -.flag-hr { - background-position: 0 -1078px; - height: 11px; - width: 16px; } - -.flag-ht { - background-position: 0 -1089px; - height: 11px; - width: 16px; } - -.flag-hu { - background-position: 0 -1100px; - height: 11px; - width: 16px; } - -.flag-id-2 { - background-position: 0 -1111px; - height: 11px; - width: 16px; } - -.flag-ie { - background-position: 0 -1122px; - height: 11px; - width: 16px; } - -.flag-il { - background-position: 0 -1133px; - height: 11px; - width: 16px; } - -.flag-in { - background-position: 0 -1144px; - height: 11px; - width: 16px; } - -.flag-io { - background-position: 0 -1155px; - height: 11px; - width: 16px; } - -.flag-iq { - background-position: 0 -1166px; - height: 11px; - width: 16px; } - -.flag-ir { - background-position: 0 -1177px; - height: 11px; - width: 16px; } - -.flag-is { - background-position: 0 -1188px; - height: 11px; - width: 16px; } - -.flag-it { - background-position: 0 -1199px; - height: 11px; - width: 16px; } - -.flag-jm { - background-position: 0 -1210px; - height: 11px; - width: 16px; } - -.flag-jo { - background-position: 0 -1221px; - height: 11px; - width: 16px; } - -.flag-jp { - background-position: 0 -1232px; - height: 11px; - width: 16px; } - -.flag-ke { +.flag-europeanunion { background-position: 0 -1243px; height: 11px; width: 16px; } -.flag-kg { - background-position: 0 -1254px; +.flag-fam { + background-position: 0 -2003px; height: 11px; width: 16px; } -.flag-kh { - background-position: 0 -1265px; +.flag-fi { + background-position: 0 -1772px; height: 11px; width: 16px; } -.flag-ki { - background-position: 0 -1276px; +.flag-fj { + background-position: 0 -286px; height: 11px; width: 16px; } -.flag-km { - background-position: 0 -1287px; +.flag-fk { + background-position: 0 -176px; height: 11px; width: 16px; } -.flag-kn { - background-position: 0 -1298px; +.flag-fm { + background-position: 0 -1166px; height: 11px; width: 16px; } -.flag-kp { - background-position: 0 -1309px; +.flag-fo { + background-position: 0 -1596px; height: 11px; width: 16px; } -.flag-kr { +.flag-fr { + background-position: 0 -1673px; + height: 11px; + width: 16px; } + +.flag-ga { + background-position: 0 -2135px; + height: 11px; + width: 16px; } + +.flag-gb { + background-position: 0 -99px; + height: 11px; + width: 16px; } + +.flag-gd { + background-position: 0 -693px; + height: 11px; + width: 16px; } + +.flag-ge { + background-position: 0 -462px; + height: 11px; + width: 16px; } + +.flag-gf { + background-position: 0 -1640px; + height: 11px; + width: 16px; } + +.flag-gh { + background-position: 0 -2267px; + height: 11px; + width: 16px; } + +.flag-gi { + background-position: 0 -1761px; + height: 11px; + width: 16px; } + +.flag-gl { + background-position: 0 -1992px; + height: 11px; + width: 16px; } + +.flag-gm { + background-position: 0 -1849px; + height: 11px; + width: 16px; } + +.flag-gn { + background-position: 0 -2454px; + height: 11px; + width: 16px; } + +.flag-gp { + background-position: 0 -1904px; + height: 11px; + width: 16px; } + +.flag-gq { + background-position: 0 -1210px; + height: 11px; + width: 16px; } + +.flag-gr { + background-position: 0 -1397px; + height: 11px; + width: 16px; } + +.flag-gs { + background-position: 0 -187px; + height: 11px; + width: 16px; } + +.flag-gt { + background-position: 0 -2212px; + height: 11px; + width: 16px; } + +.flag-gu { + background-position: 0 -1496px; + height: 11px; + width: 16px; } + +.flag-gw { + background-position: 0 -2091px; + height: 11px; + width: 16px; } + +.flag-gy { + background-position: 0 -242px; + height: 11px; + width: 16px; } + +.flag-hk { + background-position: 0 -1364px; + height: 11px; + width: 16px; } + +.flag-hm { + background-position: 0 -22px; + height: 11px; + width: 16px; } + +.flag-hn { + background-position: 0 -1155px; + height: 11px; + width: 16px; } + +.flag-hr { + background-position: 0 -1056px; + height: 11px; + width: 16px; } + +.flag-ht { + background-position: 0 -2333px; + height: 11px; + width: 16px; } + +.flag-hu { + background-position: 0 -2619px; + height: 11px; + width: 16px; } + +.flag-id-2 { + background-position: 0 -2542px; + height: 11px; + width: 16px; } + +.flag-ie { + background-position: 0 -2278px; + height: 11px; + width: 16px; } + +.flag-il { + background-position: 0 -2366px; + height: 11px; + width: 16px; } + +.flag-in { + background-position: 0 -1585px; + height: 11px; + width: 16px; } + +.flag-io { + background-position: 0 0; + height: 11px; + width: 16px; } + +.flag-iq { + background-position: 0 -1221px; + height: 11px; + width: 16px; } + +.flag-ir { background-position: 0 -1320px; height: 11px; width: 16px; } +.flag-is { + background-position: 0 -1177px; + height: 11px; + width: 16px; } + +.flag-it { + background-position: 0 -2641px; + height: 11px; + width: 16px; } + +.flag-jm { + background-position: 0 -319px; + height: 11px; + width: 16px; } + +.flag-jo { + background-position: 0 -1948px; + height: 11px; + width: 16px; } + +.flag-jp { + background-position: 0 -2465px; + height: 11px; + width: 16px; } + +.flag-ke { + background-position: 0 -935px; + height: 11px; + width: 16px; } + +.flag-kg { + background-position: 0 -1926px; + height: 11px; + width: 16px; } + +.flag-kh { + background-position: 0 -1034px; + height: 11px; + width: 16px; } + +.flag-ki { + background-position: 0 -88px; + height: 11px; + width: 16px; } + +.flag-km { + background-position: 0 -671px; + height: 11px; + width: 16px; } + +.flag-kn { + background-position: 0 -517px; + height: 11px; + width: 16px; } + +.flag-kp { + background-position: 0 -1012px; + height: 11px; + width: 16px; } + +.flag-kr { + background-position: 0 -308px; + height: 11px; + width: 16px; } + .flag-kw { - background-position: 0 -1331px; + background-position: 0 -1981px; height: 11px; width: 16px; } .flag-ky { - background-position: 0 -1342px; + background-position: 0 -143px; height: 11px; width: 16px; } .flag-kz { - background-position: 0 -1353px; + background-position: 0 -715px; height: 11px; width: 16px; } .flag-la { - background-position: 0 -1364px; + background-position: 0 -1111px; height: 11px; width: 16px; } @@ -657,62 +657,62 @@ width: 16px; } .flag-lc { - background-position: 0 -1386px; + background-position: 0 -836px; height: 11px; width: 16px; } .flag-li { - background-position: 0 -1397px; + background-position: 0 -1298px; height: 11px; width: 16px; } .flag-lk { - background-position: 0 -1408px; + background-position: 0 -682px; height: 11px; width: 16px; } .flag-lr { - background-position: 0 -1419px; + background-position: 0 -1618px; height: 11px; width: 16px; } .flag-ls { - background-position: 0 -1430px; + background-position: 0 -385px; height: 11px; width: 16px; } .flag-lt { - background-position: 0 -1441px; + background-position: 0 -2102px; height: 11px; width: 16px; } .flag-lu { - background-position: 0 -1452px; + background-position: 0 -2201px; height: 11px; width: 16px; } .flag-lv { - background-position: 0 -1463px; + background-position: 0 -2223px; height: 11px; width: 16px; } .flag-ly { - background-position: 0 -1474px; + background-position: 0 -2663px; height: 11px; width: 16px; } .flag-ma { - background-position: 0 -1485px; + background-position: 0 -2608px; height: 11px; width: 16px; } .flag-mc { - background-position: 0 -1496px; + background-position: 0 -2685px; height: 11px; width: 16px; } .flag-md { - background-position: 0 -1507px; + background-position: 0 -1232px; height: 11px; width: 16px; } @@ -722,132 +722,132 @@ width: 16px; } .flag-mg { - background-position: 0 -1530px; + background-position: 0 -2476px; height: 11px; width: 16px; } .flag-mh { - background-position: 0 -1541px; + background-position: 0 -275px; height: 11px; width: 16px; } .flag-mk { - background-position: 0 -1552px; + background-position: 0 -825px; height: 11px; width: 16px; } .flag-ml { - background-position: 0 -1563px; + background-position: 0 -2410px; height: 11px; width: 16px; } .flag-mm { - background-position: 0 -1574px; + background-position: 0 -2256px; height: 11px; width: 16px; } .flag-mn { - background-position: 0 -1585px; + background-position: 0 -2146px; height: 11px; width: 16px; } .flag-mo { - background-position: 0 -1596px; + background-position: 0 -737px; height: 11px; width: 16px; } .flag-mp { - background-position: 0 -1607px; + background-position: 0 -506px; height: 11px; width: 16px; } .flag-mq { - background-position: 0 -1618px; + background-position: 0 -132px; height: 11px; width: 16px; } .flag-mr { - background-position: 0 -1629px; + background-position: 0 -1188px; height: 11px; width: 16px; } .flag-ms { - background-position: 0 -1640px; + background-position: 0 -440px; height: 11px; width: 16px; } .flag-mt { - background-position: 0 -1651px; + background-position: 0 -2586px; height: 11px; width: 16px; } .flag-mu { - background-position: 0 -1662px; + background-position: 0 -1860px; height: 11px; width: 16px; } .flag-mv { - background-position: 0 -1673px; + background-position: 0 -1430px; height: 11px; width: 16px; } .flag-mw { - background-position: 0 -1684px; + background-position: 0 -1838px; height: 11px; width: 16px; } .flag-mx { - background-position: 0 -1695px; + background-position: 0 -990px; height: 11px; width: 16px; } .flag-my { - background-position: 0 -1706px; + background-position: 0 -561px; height: 11px; width: 16px; } .flag-mz { - background-position: 0 -1717px; + background-position: 0 -858px; height: 11px; width: 16px; } .flag-na { - background-position: 0 -1728px; + background-position: 0 -66px; height: 11px; width: 16px; } .flag-nc { - background-position: 0 -1739px; + background-position: 0 -616px; height: 11px; width: 16px; } .flag-ne { - background-position: 0 -1750px; + background-position: 0 -1353px; height: 11px; width: 16px; } .flag-nf { - background-position: 0 -1761px; + background-position: 0 -539px; height: 11px; width: 16px; } .flag-ng { - background-position: 0 -1772px; + background-position: 0 -2157px; height: 11px; width: 16px; } .flag-ni { - background-position: 0 -1783px; + background-position: 0 -1684px; height: 11px; width: 16px; } .flag-nl { - background-position: 0 -1794px; + background-position: 0 -2498px; height: 11px; width: 16px; } .flag-no { - background-position: 0 -1805px; + background-position: 0 -1287px; height: 11px; width: 16px; } @@ -857,92 +857,92 @@ width: 9px; } .flag-nr { - background-position: 0 -1827px; + background-position: 0 -1342px; height: 11px; width: 16px; } .flag-nu { - background-position: 0 -1838px; + background-position: 0 -627px; height: 11px; width: 16px; } .flag-nz { - background-position: 0 -1849px; + background-position: 0 -154px; height: 11px; width: 16px; } .flag-om { - background-position: 0 -1860px; + background-position: 0 -2234px; height: 11px; width: 16px; } .flag-pa { - background-position: 0 -1871px; + background-position: 0 -1441px; height: 11px; width: 16px; } .flag-pe { - background-position: 0 -1882px; + background-position: 0 -2674px; height: 11px; width: 16px; } .flag-pf { - background-position: 0 -1893px; + background-position: 0 -1552px; height: 11px; width: 16px; } .flag-pg { - background-position: 0 -1904px; + background-position: 0 -924px; height: 11px; width: 16px; } .flag-ph { - background-position: 0 -1915px; + background-position: 0 -979px; height: 11px; width: 16px; } .flag-pk { - background-position: 0 -1926px; + background-position: 0 -792px; height: 11px; width: 16px; } .flag-pl { - background-position: 0 -1937px; + background-position: 0 -2707px; height: 11px; width: 16px; } .flag-pm { - background-position: 0 -1948px; + background-position: 0 -33px; height: 11px; width: 16px; } .flag-pn { - background-position: 0 -1959px; + background-position: 0 -110px; height: 11px; width: 16px; } .flag-pr { - background-position: 0 -1970px; + background-position: 0 -803px; height: 11px; width: 16px; } .flag-ps { - background-position: 0 -1981px; + background-position: 0 -2047px; height: 11px; width: 16px; } .flag-pt { - background-position: 0 -1992px; + background-position: 0 -1199px; height: 11px; width: 16px; } .flag-pw { - background-position: 0 -2003px; + background-position: 0 -1001px; height: 11px; width: 16px; } .flag-py { - background-position: 0 -2014px; + background-position: 0 -2113px; height: 11px; width: 16px; } @@ -952,311 +952,311 @@ width: 16px; } .flag-re { - background-position: 0 -2036px; + background-position: 0 -1651px; height: 11px; width: 16px; } .flag-ro { - background-position: 0 -2047px; - height: 11px; - width: 16px; } - -.flag-rs { - background-position: 0 -2058px; - height: 11px; - width: 16px; } - -.flag-ru { - background-position: 0 -2069px; - height: 11px; - width: 16px; } - -.flag-rw { - background-position: 0 -2080px; - height: 11px; - width: 16px; } - -.flag-sa { - background-position: 0 -2091px; - height: 11px; - width: 16px; } - -.flag-sb { - background-position: 0 -2102px; - height: 11px; - width: 16px; } - -.flag-sc { - background-position: 0 -2113px; - height: 11px; - width: 16px; } - -.flag-scotland { - background-position: 0 -2124px; - height: 11px; - width: 16px; } - -.flag-sd { - background-position: 0 -2135px; - height: 11px; - width: 16px; } - -.flag-se { - background-position: 0 -2146px; - height: 11px; - width: 16px; } - -.flag-sg { - background-position: 0 -2157px; - height: 11px; - width: 16px; } - -.flag-sh { - background-position: 0 -2168px; - height: 11px; - width: 16px; } - -.flag-si { - background-position: 0 -2179px; - height: 11px; - width: 16px; } - -.flag-sj { - background-position: 0 -2190px; - height: 11px; - width: 16px; } - -.flag-sk { - background-position: 0 -2201px; - height: 11px; - width: 16px; } - -.flag-sl { - background-position: 0 -2212px; - height: 11px; - width: 16px; } - -.flag-sm { - background-position: 0 -2223px; - height: 11px; - width: 16px; } - -.flag-sn { - background-position: 0 -2234px; - height: 11px; - width: 16px; } - -.flag-so { - background-position: 0 -2245px; - height: 11px; - width: 16px; } - -.flag-sr { - background-position: 0 -2256px; - height: 11px; - width: 16px; } - -.flag-st { - background-position: 0 -2267px; - height: 11px; - width: 16px; } - -.flag-sv { - background-position: 0 -2278px; - height: 11px; - width: 16px; } - -.flag-sy { background-position: 0 -2289px; height: 11px; width: 16px; } -.flag-sz { - background-position: 0 -2300px; +.flag-rs { + background-position: 0 -1871px; height: 11px; width: 16px; } -.flag-tc { - background-position: 0 -2311px; - height: 11px; - width: 16px; } - -.flag-td { - background-position: 0 -2322px; - height: 11px; - width: 16px; } - -.flag-tf { - background-position: 0 -2333px; - height: 11px; - width: 16px; } - -.flag-tg { - background-position: 0 -2344px; - height: 11px; - width: 16px; } - -.flag-th { - background-position: 0 -2355px; - height: 11px; - width: 16px; } - -.flag-tj { - background-position: 0 -2366px; - height: 11px; - width: 16px; } - -.flag-tk { - background-position: 0 -2377px; - height: 11px; - width: 16px; } - -.flag-tl { - background-position: 0 -2388px; - height: 11px; - width: 16px; } - -.flag-tm { - background-position: 0 -2399px; - height: 11px; - width: 16px; } - -.flag-tn { - background-position: 0 -2410px; - height: 11px; - width: 16px; } - -.flag-to { - background-position: 0 -2421px; - height: 11px; - width: 16px; } - -.flag-tr { - background-position: 0 -2432px; - height: 11px; - width: 16px; } - -.flag-tt { - background-position: 0 -2443px; - height: 11px; - width: 16px; } - -.flag-tv { - background-position: 0 -2454px; - height: 11px; - width: 16px; } - -.flag-tw { - background-position: 0 -2465px; - height: 11px; - width: 16px; } - -.flag-tz { - background-position: 0 -2476px; - height: 11px; - width: 16px; } - -.flag-ua { - background-position: 0 -2487px; - height: 11px; - width: 16px; } - -.flag-ug { - background-position: 0 -2498px; - height: 11px; - width: 16px; } - -.flag-um { - background-position: 0 -2509px; - height: 11px; - width: 16px; } - -.flag-us { - background-position: 0 -2520px; - height: 11px; - width: 16px; } - -.flag-uy { - background-position: 0 -2531px; - height: 11px; - width: 16px; } - -.flag-uz { - background-position: 0 -2542px; - height: 11px; - width: 16px; } - -.flag-va { - background-position: 0 -2553px; - height: 11px; - width: 16px; } - -.flag-vc { +.flag-ru { background-position: 0 -2564px; height: 11px; width: 16px; } +.flag-rw { + background-position: 0 -1530px; + height: 11px; + width: 16px; } + +.flag-sa { + background-position: 0 -968px; + height: 11px; + width: 16px; } + +.flag-sb { + background-position: 0 -253px; + height: 11px; + width: 16px; } + +.flag-sc { + background-position: 0 -495px; + height: 11px; + width: 16px; } + +.flag-scotland { + background-position: 0 -55px; + height: 11px; + width: 16px; } + +.flag-sd { + background-position: 0 -1750px; + height: 11px; + width: 16px; } + +.flag-se { + background-position: 0 -1452px; + height: 11px; + width: 16px; } + +.flag-sg { + background-position: 0 -1959px; + height: 11px; + width: 16px; } + +.flag-sh { + background-position: 0 -209px; + height: 11px; + width: 16px; } + +.flag-si { + background-position: 0 -1507px; + height: 11px; + width: 16px; } + +.flag-sj { + background-position: 0 -1265px; + height: 11px; + width: 16px; } + +.flag-sk { + background-position: 0 -891px; + height: 11px; + width: 16px; } + +.flag-sl { + background-position: 0 -2432px; + height: 11px; + width: 16px; } + +.flag-sm { + background-position: 0 -1331px; + height: 11px; + width: 16px; } + +.flag-sn { + background-position: 0 -1893px; + height: 11px; + width: 16px; } + +.flag-so { + background-position: 0 -1607px; + height: 11px; + width: 16px; } + +.flag-sr { + background-position: 0 -1706px; + height: 11px; + width: 16px; } + +.flag-st { + background-position: 0 -946px; + height: 11px; + width: 16px; } + +.flag-sv { + background-position: 0 -1629px; + height: 11px; + width: 16px; } + +.flag-sy { + background-position: 0 -2377px; + height: 11px; + width: 16px; } + +.flag-sz { + background-position: 0 -330px; + height: 11px; + width: 16px; } + +.flag-tc { + background-position: 0 -352px; + height: 11px; + width: 16px; } + +.flag-td { + background-position: 0 -1563px; + height: 11px; + width: 16px; } + +.flag-tf { + background-position: 0 -1309px; + height: 11px; + width: 16px; } + +.flag-tg { + background-position: 0 -1089px; + height: 11px; + width: 16px; } + +.flag-th { + background-position: 0 -2344px; + height: 11px; + width: 16px; } + +.flag-tj { + background-position: 0 -1695px; + height: 11px; + width: 16px; } + +.flag-tk { + background-position: 0 -220px; + height: 11px; + width: 16px; } + +.flag-tl { + background-position: 0 -1078px; + height: 11px; + width: 16px; } + +.flag-tm { + background-position: 0 -770px; + height: 11px; + width: 16px; } + +.flag-tn { + background-position: 0 -1794px; + height: 11px; + width: 16px; } + +.flag-to { + background-position: 0 -2553px; + height: 11px; + width: 16px; } + +.flag-tr { + background-position: 0 -1728px; + height: 11px; + width: 16px; } + +.flag-tt { + background-position: 0 -231px; + height: 11px; + width: 16px; } + +.flag-tv { + background-position: 0 -847px; + height: 11px; + width: 16px; } + +.flag-tw { + background-position: 0 -2322px; + height: 11px; + width: 16px; } + +.flag-tz { + background-position: 0 -264px; + height: 11px; + width: 16px; } + +.flag-ua { + background-position: 0 -2531px; + height: 11px; + width: 16px; } + +.flag-ug { + background-position: 0 -1474px; + height: 11px; + width: 16px; } + +.flag-um { + background-position: 0 -583px; + height: 11px; + width: 16px; } + +.flag-us { + background-position: 0 -407px; + height: 11px; + width: 16px; } + +.flag-uy { + background-position: 0 -1144px; + height: 11px; + width: 16px; } + +.flag-uz { + background-position: 0 -1122px; + height: 11px; + width: 16px; } + +.flag-va { + background-position: 0 -1067px; + height: 11px; + width: 16px; } + +.flag-vc { + background-position: 0 -1133px; + height: 11px; + width: 16px; } + .flag-ve { - background-position: 0 -2575px; + background-position: 0 -1100px; height: 11px; width: 16px; } .flag-vg { - background-position: 0 -2586px; + background-position: 0 -341px; height: 11px; width: 16px; } .flag-vi { - background-position: 0 -2597px; + background-position: 0 -165px; height: 11px; width: 16px; } .flag-vn { - background-position: 0 -2608px; + background-position: 0 -2388px; height: 11px; width: 16px; } .flag-vu { - background-position: 0 -2619px; + background-position: 0 -726px; height: 11px; width: 16px; } .flag-wales { - background-position: 0 -2630px; + background-position: 0 -77px; height: 11px; width: 16px; } .flag-wf { - background-position: 0 -2641px; + background-position: 0 -913px; height: 11px; width: 16px; } .flag-ws { - background-position: 0 -2652px; + background-position: 0 -1937px; height: 11px; width: 16px; } .flag-ye { - background-position: 0 -2663px; + background-position: 0 -2520px; height: 11px; width: 16px; } .flag-yt { - background-position: 0 -2674px; + background-position: 0 -704px; height: 11px; width: 16px; } .flag-za { - background-position: 0 -2685px; + background-position: 0 -198px; height: 11px; width: 16px; } .flag-zm { - background-position: 0 -2696px; + background-position: 0 -1882px; height: 11px; width: 16px; } .flag-zw { - background-position: 0 -2707px; + background-position: 0 -649px; height: 11px; width: 16px; } diff --git a/test/fixtures/stylesheets/compass/images/flag-s03c3b29b35.png b/test/fixtures/stylesheets/compass/images/flag-s03c3b29b35.png deleted file mode 100644 index 3ec1e90d9c6a5abfb2123331a2ddd5596a25b1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105539 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í>nTQUCVuwEZ2@zer6d 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 T>uT4B00000NkvXXu0mjfu=~Ja diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 9afa868a..abb64542 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -115,5 +115,11 @@ class SpriteMapTest < Test::Unit::TestCase FileUtils.rm base.filename end + it "should generate vertical sprites in decending order" do + sizes = @base.images.map{|image| File.size(image.file) } + assert_equal sizes.min, File.size(@base.images.first.file) + assert_equal sizes.max, File.size(@base.images.last.file) + end + end \ No newline at end of file From c79e9970986e7d7f22ef2e24908a842dbc20d95a Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 02:08:29 -0400 Subject: [PATCH 032/290] merged in stable and added a test image --- .../compass/images/flag-s8c3c755a68.png | Bin 0 -> 77172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fixtures/stylesheets/compass/images/flag-s8c3c755a68.png diff --git a/test/fixtures/stylesheets/compass/images/flag-s8c3c755a68.png b/test/fixtures/stylesheets/compass/images/flag-s8c3c755a68.png new file mode 100644 index 0000000000000000000000000000000000000000..490903426e9cd023df42e85338494d8cd6081d97 GIT binary patch literal 77172 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 iE8x)A_fKRT{rg`y3H2tL?diS%0000 Date: Tue, 26 Jul 2011 02:30:47 -0400 Subject: [PATCH 033/290] merge --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c2b5e59e..6156cca1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.12.0.alpha.0.7a18375) + compass (0.12.0.alpha.0.c79e997) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) From 387a2ffe1f79f7091cfc65a18f4880e1d56f6de3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 14:42:57 -0400 Subject: [PATCH 034/290] fixed features to be more lieniet on sprite hashes --- Gemfile.lock | 2 +- features/command_line.feature | 4 ++-- features/step_definitions/command_line_steps.rb | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6156cca1..ec726def 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.12.0.alpha.0.c79e997) + compass (0.12.0.alpha.0.64d0787) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/features/command_line.feature b/features/command_line.feature index 56d52abb..a783281e 100644 --- a/features/command_line.feature +++ b/features/command_line.feature @@ -200,7 +200,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s03c3b29b35.png | + | images/flag-s*.png | And the following files are removed: | .sass-cache/ | | tmp/border_radius.css | @@ -208,7 +208,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s03c3b29b35.png | + | images/flag-s*.png | Scenario: Watching a project for changes Given ruby supports fork diff --git a/features/step_definitions/command_line_steps.rb b/features/step_definitions/command_line_steps.rb index fd45fdc9..37b0896d 100644 --- a/features/step_definitions/command_line_steps.rb +++ b/features/step_definitions/command_line_steps.rb @@ -133,12 +133,21 @@ end Then "the following files are reported removed:" do |table| table.rows.each do |css_file| + #need to find a better way but this works for now + if css_file.first.include?('flag-s') + css_file[0] = Dir[css_file.first].sort.first + puts css_file[0] = Dir[css_file.first].sort.first + end Then %Q{a css file #{css_file.first} is reported removed} end end Then "the following files are removed:" do |table| table.rows.each do |css_file| + #need to find a better way but this works for now + if css_file.first.include?('flag-s') + css_file[0] = Dir[css_file.first].sort.first + end Then %Q{a css file #{css_file.first} is removed} end end From 3f72a549d37f3a37b7ab9504df3bc683351008d5 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 14:59:08 -0400 Subject: [PATCH 035/290] fixed sprite hash in features --- Gemfile.lock | 2 +- features/command_line.feature | 4 ++-- features/step_definitions/command_line_steps.rb | 8 -------- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ec726def..8881495a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,7 @@ GIT PATH remote: . specs: - compass (0.12.0.alpha.0.64d0787) + compass (0.12.0.alpha.0.387a2ff) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/features/command_line.feature b/features/command_line.feature index a783281e..fd2b374c 100644 --- a/features/command_line.feature +++ b/features/command_line.feature @@ -200,7 +200,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s*.png | + | images/flag-s8c3c755a68.png | And the following files are removed: | .sass-cache/ | | tmp/border_radius.css | @@ -208,7 +208,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s*.png | + | images/flag-s8c3c755a68.png | Scenario: Watching a project for changes Given ruby supports fork diff --git a/features/step_definitions/command_line_steps.rb b/features/step_definitions/command_line_steps.rb index 37b0896d..412cabfb 100644 --- a/features/step_definitions/command_line_steps.rb +++ b/features/step_definitions/command_line_steps.rb @@ -134,20 +134,12 @@ end Then "the following files are reported removed:" do |table| table.rows.each do |css_file| #need to find a better way but this works for now - if css_file.first.include?('flag-s') - css_file[0] = Dir[css_file.first].sort.first - puts css_file[0] = Dir[css_file.first].sort.first - end Then %Q{a css file #{css_file.first} is reported removed} end end Then "the following files are removed:" do |table| table.rows.each do |css_file| - #need to find a better way but this works for now - if css_file.first.include?('flag-s') - css_file[0] = Dir[css_file.first].sort.first - end Then %Q{a css file #{css_file.first} is removed} end end From 1ad4dcaae80975f46177c16b572df38e59e4709a Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 15:11:52 -0400 Subject: [PATCH 036/290] hoping this fixes the ci server issues --- Gemfile | 10 ++-------- Gemfile.lock | 29 ++++++----------------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/Gemfile b/Gemfile index c66fc392..242b7ea6 100644 --- a/Gemfile +++ b/Gemfile @@ -7,23 +7,17 @@ gem "rspec", "~>2.0.0" gem "rails", "~>3.0.0.rc" gem "compass-validator", "3.0.1" gem "css_parser", "~> 1.0.1" -gem "sass", "~>3.1" +gem "sass", "~> 3.1" gem "haml", "~> 3.1" gem "rcov", :platform => :mri gem "rubyzip" gem "livereload" gem "ruby-prof", :platform => :mri -gem 'autotest' -gem 'autotest-fsevent' if RUBY_PLATFORM =~ /darwin/ -gem 'fakefs', :git => 'git://github.com/johnbintz/fakefs.git' gem 'mocha' gem 'timecop' gem 'diff-lcs', '~> 1.1.2' gem 'rake', '0.8.7' -group :mac do - gem "rb-fsevent" -end - +#Warning becarful adding OS dependant gems to this file it will cause issues on the CI server \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 8881495a..f5ce76db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,7 @@ -GIT - remote: git://github.com/johnbintz/fakefs.git - revision: 7363b6f13bfcd9f583bbf7cd1e0d65c2dc656db7 - specs: - fakefs (0.3.1) - PATH remote: . specs: - compass (0.12.0.alpha.0.387a2ff) + compass (0.12.0.alpha.0.3f72a54) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -15,7 +9,6 @@ PATH GEM remote: http://rubygems.org/ specs: - ZenTest (4.5.0) abstract (1.0.0) actionmailer (3.0.9) actionpack (= 3.0.9) @@ -45,10 +38,6 @@ GEM activesupport (3.0.9) addressable (2.2.6) arel (2.0.10) - autotest (4.4.6) - ZenTest (>= 4.4.1) - autotest-fsevent (0.2.5) - sys-uname builder (2.1.2) chunky_png (1.2.0) compass-validator (3.0.1) @@ -106,9 +95,8 @@ GEM rdoc (~> 3.4) thor (~> 0.14.4) rake (0.8.7) - rb-fsevent (0.4.0) rcov (0.9.9) - rdoc (3.6.1) + rdoc (3.8) rspec (2.0.1) rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) @@ -120,35 +108,30 @@ GEM rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) ruby-json (1.1.2) - ruby-prof (0.10.7) + ruby-prof (0.10.8) rubyzip (0.9.4) - sass (3.1.3) - sys-uname (0.8.5) - term-ansicolor (1.0.5) + sass (3.1.5) + term-ansicolor (1.0.6) thor (0.14.6) timecop (0.3.5) treetop (1.4.9) polyglot (>= 0.3.1) - tzinfo (0.3.28) + tzinfo (0.3.29) PLATFORMS ruby DEPENDENCIES - autotest - autotest-fsevent compass! compass-validator (= 3.0.1) css_parser (~> 1.0.1) cucumber (~> 0.9.2) diff-lcs (~> 1.1.2) - fakefs! haml (~> 3.1) livereload mocha rails (~> 3.0.0.rc) rake (= 0.8.7) - rb-fsevent rcov rspec (~> 2.0.0) ruby-prof From c950d874320765ab8645bc4b6935eb57519a4247 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 16:20:51 -0400 Subject: [PATCH 037/290] abstracted out test helpers --- test/test_helper.rb | 15 +++++++++++++++ test/units/sprites/image_test.rb | 2 +- test/units/sprites/importer_test.rb | 4 ++-- test/units/sprites/sprite_command_test.rb | 12 +----------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index a4146cc6..43981842 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -39,6 +39,11 @@ end module SpriteHelper URI = "selectors/*.png" + def init_sprite_helper + @images_src_path = File.join(File.dirname(__FILE__), 'fixtures', 'sprites', 'public', 'images') + @images_tmp_path = File.join(File.dirname(__FILE__), 'fixtures', 'sprites', 'public', 'images-tmp') + end + def sprite_map_test(options) importer = Compass::SpriteImporter.new path, name = Compass::SpriteImporter.path_and_name(URI) @@ -47,4 +52,14 @@ module SpriteHelper Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options) end + def create_sprite_temp + init_sprite_helper + ::FileUtils.cp_r @images_src_path, @images_tmp_path + end + + def clean_up_sprites + init_sprite_helper + ::FileUtils.rm_r @images_tmp_path + end + end \ No newline at end of file diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index afcc0c7c..24b635b1 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -5,7 +5,7 @@ require 'ostruct' class SpritesImageTest < Test::Unit::TestCase include SpriteHelper def setup - @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') + create_sprite_temp file = StringIO.new("images_path = #{@images_src_path.inspect}\n") Compass.add_configuration(file, "sprite_config") @repeat = 'no-repeat' diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index f9b0d79d..094a1a0f 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -1,10 +1,10 @@ require 'test_helper' require 'timecop' class ImporterTest < Test::Unit::TestCase - URI = "selectors/*.png" + include SpriteHelper def setup - @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') + create_sprite_temp file = StringIO.new("images_path = #{@images_src_path.inspect}\n") Compass.add_configuration(file, "sprite_config") @importer = Compass::SpriteImporter.new diff --git a/test/units/sprites/sprite_command_test.rb b/test/units/sprites/sprite_command_test.rb index 240b00c3..4e4354fb 100644 --- a/test/units/sprites/sprite_command_test.rb +++ b/test/units/sprites/sprite_command_test.rb @@ -2,10 +2,8 @@ require 'test_helper' class SpriteCommandTest < Test::Unit::TestCase attr_reader :test_dir - + include SpriteHelper def setup - @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') - @images_tmp_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images-tmp') @before_dir = ::Dir.pwd create_temp_cli_dir create_sprite_temp @@ -14,14 +12,6 @@ class SpriteCommandTest < Test::Unit::TestCase end end - def create_sprite_temp - ::FileUtils.cp_r @images_src_path, @images_tmp_path - end - - def clean_up_sprites - ::FileUtils.rm_r @images_tmp_path - end - def config_data return <<-CONFIG images_path = #{@images_tmp_path.inspect} From 9966421f5866078e24bd248c7cda64aedb40566c Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 16:21:21 -0400 Subject: [PATCH 038/290] configuration for sprite_search_path --- lib/compass/configuration.rb | 1 + lib/compass/configuration/defaults.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/compass/configuration.rb b/lib/compass/configuration.rb index d8efb812..58ad570d 100644 --- a/lib/compass/configuration.rb +++ b/lib/compass/configuration.rb @@ -24,6 +24,7 @@ module Compass attributes_for_directory(:fonts), attributes_for_directory(:extensions, nil), # Compilation options + :sprite_search_path, :output_style, :environment, :relative_assets, diff --git a/lib/compass/configuration/defaults.rb b/lib/compass/configuration/defaults.rb index 236ce672..abdd3efd 100644 --- a/lib/compass/configuration/defaults.rb +++ b/lib/compass/configuration/defaults.rb @@ -88,6 +88,10 @@ module Compass def default_http_images_dir top_level.images_dir end + + def default_sprite_search_path + [top_level.images_path] + end def default_http_images_path http_root_relative top_level.http_images_dir From 9c472b3c36d58c5d835146ee0c02bc25934de33f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 16:21:59 -0400 Subject: [PATCH 039/290] sprite_seach_path implimentation and test case --- lib/compass/sprite_importer.rb | 6 +++++- test/units/sprites/importer_test.rb | 21 +++++++++++++++++++++ test/units/sprites/sprite_map_test.rb | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 5eb31be2..5307b2cd 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -66,7 +66,11 @@ module Compass # Returns the Glob of image files for the uri def self.files(uri) - Dir[File.join(Compass.configuration.images_path, uri)].sort + Compass.configuration.sprite_search_path.each do |folder| + files = Dir[File.join(folder, uri)].sort + next if files.empty? + return files + end end # Returns an Array of image names without the file extension diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index 094a1a0f..9d058704 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -18,6 +18,27 @@ class ImporterTest < Test::Unit::TestCase {:foo => 'bar'} end + test "should use search path to find sprites" do + Compass.reset_configuration! + uri = 'foo/*.png' + other_folder = File.join(@images_tmp_path, '../other-temp') + FileUtils.mkdir_p other_folder + FileUtils.mkdir_p File.join(other_folder, 'foo') + %w(my bar).each do |file| + FileUtils.touch(File.join(other_folder, "foo/#{file}.png")) + end + config = Compass::Configuration::Data.new('config') + config.images_path = @images_tmp_path + config.sprite_search_path = [@images_tmp_path, other_folder] + Compass.add_configuration(config, "sprite_config") + importer = Compass::SpriteImporter.new + assert_equal 2, Compass.configuration.sprite_search_path.compact.size + assert Compass.configuration.sprite_search_path.include?(other_folder) + assert_equal ["bar", "my"], Compass::SpriteImporter.sprite_names(uri) + + FileUtils.rm_rf other_folder + end + test "name should return the sprite name" do assert_equal 'selectors', Compass::SpriteImporter.sprite_name(URI) end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index abb64542..25d5a98e 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -10,6 +10,7 @@ class SpriteMapTest < Test::Unit::TestCase FileUtils.cp_r @images_src_path, @images_tmp_path config = Compass::Configuration::Data.new('config') config.images_path = @images_tmp_path + config.sprite_search_path = [@images_tmp_path] Compass.add_configuration(config) Compass.configure_sass_plugin! @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')} From 5e89865192b4550bbe29ceb2e2790ce09676d0b8 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 17:43:08 -0400 Subject: [PATCH 040/290] fixed rails 3.0.x --- lib/compass/app_integration/rails/actionpack30/railtie.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack30/railtie.rb b/lib/compass/app_integration/rails/actionpack30/railtie.rb index 2e52ae3b..a3fc5498 100644 --- a/lib/compass/app_integration/rails/actionpack30/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack30/railtie.rb @@ -40,10 +40,7 @@ module Compass initializer "compass.initialize_rails" do |app| # Configure compass for use within rails, and provide the project configuration # that came via the rails boot process. - Compass::AppIntegration::Rails.check_for_double_boot! - Compass.discover_extensions! - Compass.configure_sass_plugin! - Compass.handle_configuration_change! + Compass::AppIntegration::Rails.initialize!(app.config.compass) end end end \ No newline at end of file From 71494cecfeecb47a57ddb8711306bcbe4bbc5bed Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 26 Jul 2011 17:53:56 -0400 Subject: [PATCH 041/290] rename sprite_search_path to sprite_load_path for consistancy --- Gemfile.lock | 2 +- lib/compass/configuration.rb | 2 +- lib/compass/configuration/defaults.rb | 2 +- lib/compass/sprite_importer.rb | 2 +- test/units/sprites/importer_test.rb | 6 +++--- test/units/sprites/sprite_map_test.rb | 1 - 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f5ce76db..6afb9c26 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.3f72a54) + compass (0.12.0.alpha.0.5e89865) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/configuration.rb b/lib/compass/configuration.rb index 58ad570d..91793a5c 100644 --- a/lib/compass/configuration.rb +++ b/lib/compass/configuration.rb @@ -24,7 +24,7 @@ module Compass attributes_for_directory(:fonts), attributes_for_directory(:extensions, nil), # Compilation options - :sprite_search_path, + :sprite_load_path, :output_style, :environment, :relative_assets, diff --git a/lib/compass/configuration/defaults.rb b/lib/compass/configuration/defaults.rb index abdd3efd..99a68c61 100644 --- a/lib/compass/configuration/defaults.rb +++ b/lib/compass/configuration/defaults.rb @@ -89,7 +89,7 @@ module Compass top_level.images_dir end - def default_sprite_search_path + def default_sprite_load_path [top_level.images_path] end diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 5307b2cd..6b8f2d94 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -66,7 +66,7 @@ module Compass # Returns the Glob of image files for the uri def self.files(uri) - Compass.configuration.sprite_search_path.each do |folder| + Compass.configuration.sprite_load_path.each do |folder| files = Dir[File.join(folder, uri)].sort next if files.empty? return files diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index 9d058704..a726a413 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -29,11 +29,11 @@ class ImporterTest < Test::Unit::TestCase end config = Compass::Configuration::Data.new('config') config.images_path = @images_tmp_path - config.sprite_search_path = [@images_tmp_path, other_folder] + config.sprite_load_path = [@images_tmp_path, other_folder] Compass.add_configuration(config, "sprite_config") importer = Compass::SpriteImporter.new - assert_equal 2, Compass.configuration.sprite_search_path.compact.size - assert Compass.configuration.sprite_search_path.include?(other_folder) + assert_equal 2, Compass.configuration.sprite_load_path.compact.size + assert Compass.configuration.sprite_load_path.include?(other_folder) assert_equal ["bar", "my"], Compass::SpriteImporter.sprite_names(uri) FileUtils.rm_rf other_folder diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 25d5a98e..abb64542 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -10,7 +10,6 @@ class SpriteMapTest < Test::Unit::TestCase FileUtils.cp_r @images_src_path, @images_tmp_path config = Compass::Configuration::Data.new('config') config.images_path = @images_tmp_path - config.sprite_search_path = [@images_tmp_path] Compass.add_configuration(config) Compass.configure_sass_plugin! @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')} From 0984b48b24dffbde40ecbeda43e5fe835acfa471 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 27 Jul 2011 02:11:45 -0400 Subject: [PATCH 042/290] adjust spritmap class to usr load path to get relative sprite names --- Gemfile.lock | 2 +- lib/compass/sass_extensions/sprites/sprite_map.rb | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6afb9c26..5df9882b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.5e89865) + compass (0.12.0.alpha.0.71494ce) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index aa9179a1..8c7f670f 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -17,10 +17,18 @@ module Compass name, path = Compass::SpriteImporter.path_and_name(uri) files = Compass::SpriteImporter.files(uri) sprites = files.map do |sprite| - sprite.gsub("#{Compass.configuration.images_path}/", "") + relative_name(sprite) end new(sprites, path, name, context, kwargs) end + + def self.relative_name(sprite) + Compass.configuration.sprite_load_path.each do |path| + if sprite.include?(path) + return sprite.gsub("#{path}/", "") + end + end + end def initialize(sprites, path, name, context, kwargs) @image_names = sprites From 8c48248a725e66508f0bfc1c0d82c1ee0e36247d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 27 Jul 2011 02:39:24 -0400 Subject: [PATCH 043/290] more importer tests --- Gemfile.lock | 2 +- lib/compass/sass_extensions/sprites/image.rb | 15 ++++++++++++- .../sass_extensions/sprites/layout_methods.rb | 2 +- .../sass_extensions/sprites/sprite_map.rb | 2 ++ test/units/sprites/image_test.rb | 22 ++++++++++++++++++- test/units/sprites/sprite_map_test.rb | 17 ++++++++++++++ 6 files changed, 56 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5df9882b..7b6092b5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.71494ce) + compass (0.12.0.alpha.0.0984b48) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/image.rb b/lib/compass/sass_extensions/sprites/image.rb index 3a3e57cf..fc842b3d 100644 --- a/lib/compass/sass_extensions/sprites/image.rb +++ b/lib/compass/sass_extensions/sprites/image.rb @@ -17,7 +17,16 @@ module Compass # The Full path to the image def file - File.join(Compass.configuration.images_path, relative_file) + @file ||= find_file + end + + def find_file + Compass.configuration.sprite_load_path.each do |path| + f = File.join(path, relative_file) + if File.exists?(f) + return f + end + end end # Width of the image @@ -25,6 +34,10 @@ module Compass dimensions.first end + def size + @size ||= File.size(file) + end + # Height of the image def height dimensions.last diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 48235588..eddfd088 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -16,7 +16,7 @@ module Compass calculate_horizontal_positions calculate_width else - @images.sort! {|a,b| File.size(b.file) <=> File.size(a.file)} #put small images first + @images.sort! {|a,b| b.size <=> b.size} #put small images first calculate_width calulate_vertical_postions calculate_height diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index 8c7f670f..e8c2e2e8 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -23,7 +23,9 @@ module Compass end def self.relative_name(sprite) + sprite = File.expand_path(sprite) Compass.configuration.sprite_load_path.each do |path| + path = File.expand_path(path) if sprite.include?(path) return sprite.gsub("#{path}/", "") end diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index 24b635b1..a3342138 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -15,7 +15,7 @@ class SpritesImageTest < Test::Unit::TestCase end let(:sprite_filename) { 'squares/ten-by-ten.png' } - let(:sprite_path) { File.join(@images_src_path, sprite_filename) } + let(:sprite_path) { File.join(@images_tmp_path, sprite_filename) } let(:sprite_name) { File.basename(sprite_filename, '.png') } @@ -91,4 +91,24 @@ class SpritesImageTest < Test::Unit::TestCase assert_equal 0, img.offset end + + test 'gets name for sprite in search path' do + Compass.reset_configuration! + uri = 'foo/*.png' + other_folder = File.join(@images_tmp_path, '../other-temp') + FileUtils.mkdir_p other_folder + FileUtils.mkdir_p File.join(other_folder, 'foo') + %w(my bar).each do |file| + FileUtils.touch(File.join(other_folder, "foo/#{file}.png")) + end + config = Compass::Configuration::Data.new('config') + config.images_path = @images_tmp_path + config.sprite_load_path = [@images_tmp_path, other_folder] + Compass.add_configuration(config, "sprite_config") + image = Compass::SassExtensions::Sprites::Image.new(sprite_map_test(options), "foo/my.png", options) + assert_equal File.join(other_folder, 'foo/my.png'), image.file + assert_equal 0, image.size + FileUtils.rm_rf other_folder + end + end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index abb64542..319cc32e 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -121,5 +121,22 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal sizes.max, File.size(@base.images.last.file) end + test "should get correct relative_name" do + Compass.reset_configuration! + uri = 'foo/*.png' + other_folder = File.join(@images_tmp_path, '../other-temp') + FileUtils.mkdir_p other_folder + FileUtils.mkdir_p File.join(other_folder, 'foo') + %w(my bar).each do |file| + FileUtils.touch(File.join(other_folder, "foo/#{file}.png")) + end + config = Compass::Configuration::Data.new('config') + config.images_path = @images_tmp_path + config.sprite_load_path = [@images_tmp_path, other_folder] + Compass.add_configuration(config, "sprite_config") + assert_equal 'foo/my.png', Compass::SassExtensions::Sprites::SpriteMap.relative_name(File.join(other_folder, 'foo/my.png')) + FileUtils.rm_rf other_folder + end + end \ No newline at end of file From 3a4d1e07b77bfab1282570e193dbbe1eab9766da Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 27 Jul 2011 03:01:28 -0400 Subject: [PATCH 044/290] reverted sorting back to one liner --- Gemfile.lock | 2 +- lib/compass/sass_extensions/sprites/layout_methods.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7b6092b5..aaf6f1eb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.0984b48) + compass (0.12.0.alpha.0.8c48248) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index eddfd088..56a219f6 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -16,7 +16,7 @@ module Compass calculate_horizontal_positions calculate_width else - @images.sort! {|a,b| b.size <=> b.size} #put small images first + @images.sort! {|a,b| b.size <=> a.size} calculate_width calulate_vertical_postions calculate_height From b57822c1348b97ce77529473d49fe990085b298e Mon Sep 17 00:00:00 2001 From: Joeri Samson Date: Wed, 27 Jul 2011 17:31:10 +0200 Subject: [PATCH 045/290] Failing test for changing http_path with rails --- test/units/rails_configuration_test.rb | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/units/rails_configuration_test.rb diff --git a/test/units/rails_configuration_test.rb b/test/units/rails_configuration_test.rb new file mode 100644 index 00000000..da298538 --- /dev/null +++ b/test/units/rails_configuration_test.rb @@ -0,0 +1,50 @@ +require 'test_helper' +require 'compass' +require 'stringio' + +class ConfigurationTest < Test::Unit::TestCase + + setup do + Compass.reset_configuration! + end + + after do + Compass.reset_configuration! + end + + def test_defaults + contents = StringIO.new(<<-CONFIG) + project_type = :rails + CONFIG + config = Compass.configuration_for(contents, "config/compass.rb") + + Compass.add_project_configuration(config, :project_type => "rails") + + assert_equal 'public/images', Compass.configuration.images_dir + assert_equal 'public/stylesheets', Compass.configuration.css_dir + assert_equal 'public/fonts', Compass.configuration.fonts_dir + + assert_equal '/', Compass.configuration.http_path + assert_equal '/images', Compass.configuration.http_images_path + assert_equal '/stylesheets', Compass.configuration.http_stylesheets_path + assert_equal '/fonts', Compass.configuration.http_fonts_path + + # Other default values must wait until I have a better idea of how to mock Sass::Util.app_geq + end + + def test_http_path_change + contents = StringIO.new(<<-CONFIG) + project_type = :rails + + http_path = "/test/alternative_path" + CONFIG + config = Compass.configuration_for(contents, "config/compass.rb") + + Compass.add_project_configuration(config, :project_type => "rails") + + assert_equal '/test/alternative_path', Compass.configuration.http_path + assert_equal '/test/alternative_path/images', Compass.configuration.http_images_path + assert_equal '/test/alternative_path/stylesheets', Compass.configuration.http_stylesheets_path + assert_equal '/test/alternative_path/fonts', Compass.configuration.http_fonts_path + end +end From ec7c4b2e9caef7885a5850f199f8917a6c9cb1fd Mon Sep 17 00:00:00 2001 From: Joeri Samson Date: Wed, 27 Jul 2011 17:32:01 +0200 Subject: [PATCH 046/290] Fix failing test for change to http_path in rails --- .../app_integration/rails/configuration_defaults.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb index 06aaf311..dffb7bc8 100644 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ b/lib/compass/app_integration/rails/configuration_defaults.rb @@ -50,19 +50,21 @@ module Compass end def default_http_images_path - "#{top_level.http_path}images" + # Relies on the fact that this will be loaded after the "normal" + # defaults, so that method_missing finds http_root_relative + http_root_relative "images" end def default_http_javascripts_path - "#{top_level.http_path}javascripts" + http_root_relative "javascripts" end def default_http_fonts_path - "#{top_level.http_path}fonts" + http_root_relative "fonts" end def default_http_stylesheets_path - "#{top_level.http_path}stylesheets" + http_root_relative "stylesheets" end def default_extensions_dir From 289c452d648764284d39beaa8e75d58ea5e85f62 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 27 Jul 2011 21:31:56 -0400 Subject: [PATCH 047/290] patched image functions to accept a real path --- Gemfile.lock | 2 +- lib/compass/sass_extensions/functions/image_size.rb | 12 ++++++++++-- lib/compass/sass_extensions/functions/sprites.rb | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index aaf6f1eb..a3433dd2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.8c48248) + compass (0.12.0.alpha.0.ec7c4b2) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 175d3dba..0490e703 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -1,14 +1,22 @@ module Compass::SassExtensions::Functions::ImageSize # Returns the width of the image relative to the images directory def image_width(image_file) - image_path = real_path(image_file) + image_path = if File.exists?(image_file.value) + image_file.value + else + real_path(image_file) + end width = ImageProperties.new(image_path).size.first Sass::Script::Number.new(width,["px"]) end # Returns the height of the image relative to the images directory def image_height(image_file) - image_path = real_path(image_file) + image_path = if File.exists?(image_file.value) + image_file.value + else + real_path(image_file) + end height = ImageProperties.new(image_path).size.last Sass::Script::Number.new(height, ["px"]) end diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index d006d3ee..d2f74b61 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -61,7 +61,7 @@ module Compass::SassExtensions::Functions::Sprites verify_map(map, "sprite") verify_sprite(sprite) if image = map.image_for(sprite.value) - Sass::Script::String.new(image.relative_file) + Sass::Script::String.new(image.file) else missing_image!(map, sprite) end From acfd1e43a2d7332fde7e960adb890ca86f573ed9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 18:49:06 -0400 Subject: [PATCH 048/290] fixed trig functions closes #498 --- lib/compass/sass_extensions/functions/trig.rb | 3 ++- test/units/sass_extensions_test.rb | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/compass/sass_extensions/functions/trig.rb b/lib/compass/sass_extensions/functions/trig.rb index 95c38508..5ee9436d 100644 --- a/lib/compass/sass_extensions/functions/trig.rb +++ b/lib/compass/sass_extensions/functions/trig.rb @@ -19,9 +19,10 @@ module Compass::SassExtensions::Functions::Trig private def trig(operation, number) if number.numerator_units == ["deg"] && number.denominator_units == [] - Sass::Script::Number.new(Math.send(operation, Math::PI * number.value / 360)) + Sass::Script::Number.new(Math.send(operation, (number.value * Math::PI / 180))) else Sass::Script::Number.new(Math.send(operation, number.value), number.numerator_units, number.denominator_units) end end + end diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 569d49f0..8b8aeabd 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -65,18 +65,21 @@ class SassExtensionsTest < Test::Unit::TestCase end def test_trig_functions + assert_equal "0.841", evaluate("sin(1)") assert_equal "0.841px", evaluate("sin(1px)") assert_equal "0.0", evaluate("sin(pi())") assert_equal "1", evaluate("sin(pi() / 2)") - assert_equal "1", evaluate("sin(180deg)") + assert_equal "0.0", evaluate("sin(180deg)") assert_equal "-1", evaluate("sin(3* pi() / 2)") assert_equal "-1", evaluate("cos(pi())") - assert_equal "-1", evaluate("cos(360deg)") + assert_equal "1", evaluate("cos(360deg)") + assert_equal "-0.176", evaluate("sin(270)") assert_equal "1", evaluate("cos(2*pi())") assert_equal "0.0", evaluate("cos(pi() / 2)") assert_equal "0.0", evaluate("cos(3* pi() / 2)") assert_equal "0.0", evaluate("tan(pi())") assert_equal "0.0", evaluate("tan(360deg)") + assert_equal "0.959", evaluate("sin(360)") assert evaluate("tan(pi()/2 - 0.0001)").to_f > 1000, evaluate("tan(pi()/2 - 0.0001)") assert evaluate("tan(pi()/2 + 0.0001)").to_f < -1000, evaluate("tan(pi()/2 - 0.0001)") end From 26b2d1fcba92b03646f0f7812e38c0314e14f080 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 22:08:05 -0400 Subject: [PATCH 049/290] added test for diagonal layout --- test/units/sprites/sprite_map_test.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 319cc32e..b922b1f0 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -88,7 +88,22 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal [0, 10, 20, 30], @base.images.map(&:top) assert_equal [0, 0, 0, 0], @base.images.map(&:left) end + + def diagonal + opts = @options.merge("layout" => Sass::Script::String.new('diagonal')) + sprite_map_test(opts) + end + + it "should generate a diagonal sprite" do + base = diagonal + base.generate + assert_equal 40, base.width + assert_equal 40, base.height + assert_equal [[0,0], [10,10], [20,20], [30,30]], base.images.map {|i| [i.top, i.left]} + assert File.exists?(base.filename) + FileUtils.rm base.filename + end # Horizontal tests def horizontal @@ -114,7 +129,7 @@ class SpriteMapTest < Test::Unit::TestCase assert File.exists?(base.filename) FileUtils.rm base.filename end - + it "should generate vertical sprites in decending order" do sizes = @base.images.map{|image| File.size(image.file) } assert_equal sizes.min, File.size(@base.images.first.file) From 08e92fadb2c547d3498e9410ca2016fdd8c35e2d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 22:08:27 -0400 Subject: [PATCH 050/290] layout for diagonal sprite --- .../sass_extensions/sprites/layout_methods.rb | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 56a219f6..f194e742 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -3,23 +3,52 @@ module Compass module Sprites module LayoutMethods HORIZONTAL = 'horizontal' + DIAGONAL = 'diagonal' def horizontal? @kwargs.get_var('layout').value == HORIZONTAL end + def diagonal? + @kwargs.get_var('layout').value == DIAGONAL + end + # Calculates the overal image dimensions # collects image sizes and input parameters for each sprite def compute_image_positions! - if horizontal? - calculate_height + case @kwargs.get_var('layout').value + when DIAGONAL + calculate_diagonal_dimensions + calculate_diagonal_positions + when HORIZONTAL + @height = height_for_horizontal_layout calculate_horizontal_positions - calculate_width + @width = width_for_horizontal_layout else @images.sort! {|a,b| b.size <=> a.size} - calculate_width + @width = width_for_vertical_layout calulate_vertical_postions - calculate_height + @height = height_for_vertical_layout + end + end + + def calculate_diagonal_dimensions + @width = @images.map {|image| image.width}.inject(0) {|width, sum| sum + width} + @height = @images.map {|image| image.height}.inject(0) {|height, sum| sum + height} + end + + def calculate_diagonal_positions + previous = nil + @images.each_with_index do |image, index| + if previous.nil? + previous = image + image.top = 0 + image.left = 0 + next + end + image.top = previous.top + previous.height + image.left = previous.left + previous.width + previous = image end end @@ -41,20 +70,6 @@ module Compass end end - - def calculate_dimensions! - calculate_width - calculate_height - end - - def calculate_height - @height = if horizontal? - height_for_horizontal_layout - else - height_for_vertical_layout - end - end - def height_for_vertical_layout last = @images.last last.top + last.height @@ -64,14 +79,6 @@ module Compass @height = @images.map {|image| image.height + image.spacing}.max end - def calculate_width - @width = if horizontal? - width_for_horizontal_layout - else - width_for_vertical_layout - end - end - def width_for_horizontal_layout @images.inject(0) { |sum, image| sum += (image.width + image.offset) } end From 5f2cf884b60ea510f49e65ad6f62c3fa7358b260 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 22:13:13 -0400 Subject: [PATCH 051/290] docs for diagonal layout --- doc-src/content/help/tutorials/spriting.markdown | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 6a5b9ad7..dfd4fd5c 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -55,11 +55,20 @@ is located within it. ## Layout Control -If you prefer horizontal sprites to the `vertical` default just set the magic variable `$-layout` variable. +Set the `$-layout` variable to the preferred layout method. + +* vertical - default +* horizontal - lays images out side by side +* diagonal - lays images out corner to corner none of the spacing of padding options are taken into account + +Example: $icon-layout:horizontal; @import "icon/*.png"; - + + $dropcap-layout:diagonal + @import "dropcap/*.png"; + ## Selector Control From d4227346af53bfe9c4175c98c0d1bfa1b1c2ec40 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:34:59 -0400 Subject: [PATCH 052/290] new tests --- .../sprites/public/images/image_row/large.png | Bin 0 -> 2857 bytes .../public/images/image_row/large_square.png | Bin 0 -> 2826 bytes .../public/images/image_row/medium.png | Bin 0 -> 2832 bytes .../sprites/public/images/image_row/small.png | Bin 0 -> 2809 bytes .../sprites/public/images/image_row/tall.png | Bin 0 -> 2817 bytes test/units/sprites/image_row_test.rb | 57 +++++++++++++++ test/units/sprites/row_fitter_test.rb | 66 ++++++++++++++++++ 7 files changed, 123 insertions(+) create mode 100644 test/fixtures/sprites/public/images/image_row/large.png create mode 100644 test/fixtures/sprites/public/images/image_row/large_square.png create mode 100644 test/fixtures/sprites/public/images/image_row/medium.png create mode 100644 test/fixtures/sprites/public/images/image_row/small.png create mode 100644 test/fixtures/sprites/public/images/image_row/tall.png create mode 100644 test/units/sprites/image_row_test.rb create mode 100644 test/units/sprites/row_fitter_test.rb diff --git a/test/fixtures/sprites/public/images/image_row/large.png b/test/fixtures/sprites/public/images/image_row/large.png new file mode 100644 index 0000000000000000000000000000000000000000..f86cca9bea7ec5e8cb180e38df18b69c98d9d204 GIT binary patch literal 2857 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 Hu0mjf#Wz73 literal 0 HcmV?d00001 diff --git a/test/fixtures/sprites/public/images/image_row/large_square.png b/test/fixtures/sprites/public/images/image_row/large_square.png new file mode 100644 index 0000000000000000000000000000000000000000..b99cf980d85d38e570ab4c2bb1b57651f5786a2c GIT binary patch literal 2826 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/sprites/public/images/image_row/medium.png b/test/fixtures/sprites/public/images/image_row/medium.png new file mode 100644 index 0000000000000000000000000000000000000000..faf62a6dc47abbf1820ecbcc552ee518c74130da GIT binary patch literal 2832 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 TFNEVs00000NkvXXu0mjf?7ull literal 0 HcmV?d00001 diff --git a/test/units/sprites/image_row_test.rb b/test/units/sprites/image_row_test.rb new file mode 100644 index 00000000..4c92b88a --- /dev/null +++ b/test/units/sprites/image_row_test.rb @@ -0,0 +1,57 @@ +require 'test_helper' + +class ImageRowTest < Test::Unit::TestCase + include SpriteHelper + def setup + create_sprite_temp + file = StringIO.new("images_path = #{@images_src_path.inspect}\n") + Compass.add_configuration(file, "sprite_config") + @filenames = %w(large.png large_square.png medium.png tall.png small.png) + @image_files = Dir["#{@images_src_path}/image_row/*.png"].sort + @images = @image_files.map do |img| + img.gsub!("#{@images_src_path}/", '') + Compass::SassExtensions::Sprites::Image.new(nil, img, {}) + end + image_row(1000) + end + + def teardown + clean_up_sprites + end + + def image_row(max) + @image_row = Compass::SassExtensions::Sprites::ImageRow.new(max) + end + + def populate_row + @images.each do |image| + assert @image_row.add(image) + end + end + + it "should return false if image will not fit in row" do + image_row(100) + img = Compass::SassExtensions::Sprites::Image.new(nil, File.join('image_row', 'large.png'), {}) + assert !@image_row.add(img) + end + + it "should have 5 images" do + populate_row + assert_equal 5, @image_row.images.size + end + + it "should return max image width" do + populate_row + assert_equal 400, @image_row.width + end + + it "should return max image height" do + populate_row + assert_equal 40, @image_row.height + end + + it "should have an efficiency rating" do + populate_row + assert_equal 1 - (580.0 / 1000.0), @image_row.efficiency + end +end \ No newline at end of file diff --git a/test/units/sprites/row_fitter_test.rb b/test/units/sprites/row_fitter_test.rb new file mode 100644 index 00000000..38096ef8 --- /dev/null +++ b/test/units/sprites/row_fitter_test.rb @@ -0,0 +1,66 @@ +require 'test_helper' +require 'compass/sass_extensions/sprites/row_fitter' + +class RowFitterTest < Test::Unit::TestCase + include SpriteHelper + def setup + file = StringIO.new("images_path = #{@images_src_path.inspect}\n") + Compass.add_configuration(file, "sprite_config") + end + + def row_fitter(images = nil) + @row_fitter ||= Compass::SassExtensions::Sprites::RowFitter.new(images) + end + + def teardown + @row_fitter = nil + end + + def create_images(dims) + dims.collect { |width, height| + image = Compass::SassExtensions::Sprites::Image.new('blah', 'blah', {}) + image.stubs(:width => width, :height => height) + image + } + end + + def basic_dims + [ + [ 100, 10 ], + [ 80, 10 ], + [ 50, 10 ], + [ 35, 10 ], + [ 20, 10 ] + ] + end + + it 'should use the fast placement algorithm' do + images = create_images(basic_dims) + + row_fitter(images) + assert_equal 100, row_fitter.width + + row_fitter.fit!(:fast) + + assert_equal 4, row_fitter.rows.length + + assert_equal [ images[0] ], row_fitter[0].images + assert_equal [ images[1] ], row_fitter[1].images + assert_equal [ images[2], images[3] ], row_fitter[2].images + assert_equal [ images[4] ], row_fitter[3].images + end + + it 'should use the scan placement algorithm' do + images = create_images(basic_dims) + + row_fitter(images) + + row_fitter.fit!(:scan) + + assert_equal 3, row_fitter.rows.length + + assert_equal [ images[0] ], row_fitter[0].images + assert_equal [ images[1], images[4] ], row_fitter[1].images + assert_equal [ images[2], images[3] ], row_fitter[2].images + end +end \ No newline at end of file From 87240723e7970dc48e2f29c6872e99ff72b4ec94 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:35:27 -0400 Subject: [PATCH 053/290] smart packing helper classes --- .../sass_extensions/sprites/image_row.rb | 47 ++++++++++ .../sass_extensions/sprites/row_fitter.rb | 86 +++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 lib/compass/sass_extensions/sprites/image_row.rb create mode 100644 lib/compass/sass_extensions/sprites/row_fitter.rb diff --git a/lib/compass/sass_extensions/sprites/image_row.rb b/lib/compass/sass_extensions/sprites/image_row.rb new file mode 100644 index 00000000..51ae0d73 --- /dev/null +++ b/lib/compass/sass_extensions/sprites/image_row.rb @@ -0,0 +1,47 @@ +require 'forwardable' + +module Compass + module SassExtensions + module Sprites + class ImageRow + extend Forwardable + + attr_reader :images, :max_width + def_delegators :@images, :last, :delete, :empty?, :length + + def initialize(max_width) + @images = [] + @max_width = max_width + end + + def add(image) + return false if !will_fit?(image) + @images << image + true + end + + alias :<< :add + + def height + images.map(&:height).max + end + + def width + images.map(&:width).max + end + + def total_width + images.inject(0) {|sum, img| sum + img.width } + end + + def efficiency + 1 - (total_width.to_f / max_width.to_f) + end + + def will_fit?(image) + (total_width + image.width) <= max_width + end + end + end + end +end \ No newline at end of file diff --git a/lib/compass/sass_extensions/sprites/row_fitter.rb b/lib/compass/sass_extensions/sprites/row_fitter.rb new file mode 100644 index 00000000..b5afff0f --- /dev/null +++ b/lib/compass/sass_extensions/sprites/row_fitter.rb @@ -0,0 +1,86 @@ +require 'forwardable' + +module Compass + module SassExtensions + module Sprites + class RowFitter + extend Forwardable + + attr_reader :images, :rows + def_delegators :rows, :[] + + def initialize(images) + @images = images.sort {|a,b| a.height <=> b.height } + @rows = [] + end + + def fit!(style = :scan) + send("#{style}_fit") + @rows + end + + def width + @width ||= @images.collect(&:width).max + end + + def height + @height ||= @rows.inject(0) {|sum, row| sum += row.height} + end + + def efficiency + @rows.inject(0) { |sum, row| sum += row.efficiency } ** @rows.length + end + + private + def new_row(image = nil) + row = Compass::SassExtensions::Sprites::ImageRow.new(width) + row.add(image) if image + row + end + + def fast_fit + row = new_row + @images.each do |image| + if !row.add(image) + @rows << row + row = new_row(image) + end + end + + @rows << row + end + + def scan_fit + fast_fit + + moved_images = [] + + begin + removed = false + + catch :done do + @rows.each do |row| + (@rows - [ row ]).each do |other_row| + other_row.images.each do |image| + if !moved_images.include?(image) + if row.will_fit?(image) + other_row.delete(image) + row << image + + @rows.delete(other_row) if other_row.empty? + removed = true + + moved_images << image + throw :done + end + end + end + end + end + end + end while removed + end + end + end + end +end \ No newline at end of file From ef4c897de59a6ba18cbb41ab6c174074c815b996 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:35:53 -0400 Subject: [PATCH 054/290] tests for smart packing --- test/units/sprites/sprite_map_test.rb | 30 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index b922b1f0..30b601b9 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -5,19 +5,16 @@ class SpriteMapTest < Test::Unit::TestCase def setup Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader) - @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') - @images_tmp_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images-tmp') - FileUtils.cp_r @images_src_path, @images_tmp_path - config = Compass::Configuration::Data.new('config') - config.images_path = @images_tmp_path - Compass.add_configuration(config) + create_sprite_temp + file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n") + Compass.add_configuration(file, "sprite_config") Compass.configure_sass_plugin! @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')} @base = sprite_map_test(@options) end def teardown - FileUtils.rm_r @images_tmp_path + clean_up_sprites @base = nil end @@ -89,6 +86,25 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal [0, 0, 0, 0], @base.images.map(&:left) end + def smart + options = @options.merge("layout" => Sass::Script::String.new('smart')) + importer = Compass::SpriteImporter.new + uri = "image_row/*.png" + path, name = Compass::SpriteImporter.path_and_name(uri) + sprite_names = Compass::SpriteImporter.sprite_names(uri) + sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) + Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map {|n| "image_row/#{n}.png"}, path, name, sass_engine, options) + end + + it "should have a smart layout" do + base = smart + base.generate + assert_equal 400, base.width + assert_equal 60, base.height + assert_equal [[0, 0], [20, 120], [20, 20], [20, 0], [20, 160]], base.images.map {|i| [i.top, i.left]} + assert File.exists?(base.filename) + FileUtils.rm base.filename + end def diagonal opts = @options.merge("layout" => Sass::Script::String.new('diagonal')) From 59722ef4ad48a1a52f73ac3828d0ded1d3fb0002 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:36:20 -0400 Subject: [PATCH 055/290] smart packing implimentation thanks @johnbintz --- lib/compass/sass_extensions/sprites.rb | 3 ++- .../sass_extensions/sprites/layout_methods.rb | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb index 246836a7..b5f08a94 100644 --- a/lib/compass/sass_extensions/sprites.rb +++ b/lib/compass/sass_extensions/sprites.rb @@ -7,7 +7,8 @@ module Compass end end end - +require 'compass/sass_extensions/sprites/image_row' +require 'compass/sass_extensions/sprites/row_fitter' require 'compass/sass_extensions/sprites/image' require 'compass/sass_extensions/sprites/layout_methods' require 'compass/sass_extensions/sprites/sprite_methods' diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index f194e742..5a030231 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -4,6 +4,11 @@ module Compass module LayoutMethods HORIZONTAL = 'horizontal' DIAGONAL = 'diagonal' + SMART = 'smart' + + def smart? + @kwargs.get_var('layout').value == SMART + end def horizontal? @kwargs.get_var('layout').value == HORIZONTAL @@ -17,6 +22,10 @@ module Compass # collects image sizes and input parameters for each sprite def compute_image_positions! case @kwargs.get_var('layout').value + when SMART + require 'compass/sass_extensions/sprites/image_row' + require 'compass/sass_extensions/sprites/row_fitter' + calculate_smart_positions when DIAGONAL calculate_diagonal_dimensions calculate_diagonal_positions @@ -32,6 +41,23 @@ module Compass end end + def calculate_smart_positions + fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images) + current_y = 0 + fitter.fit!.each do |row| + current_x = 0 + row.images.each_with_index do |image, index| + image.left = current_x + image.top = current_y + current_x += image.width + end + current_y += row.height + end + @width = fitter.width + @height = fitter.height + end + + def calculate_diagonal_dimensions @width = @images.map {|image| image.width}.inject(0) {|width, sum| sum + width} @height = @images.map {|image| image.height}.inject(0) {|height, sum| sum + height} From 590123aeba5f03475fc37b2d3c327d0839d4508f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:37:31 -0400 Subject: [PATCH 056/290] smart pack docs --- doc-src/content/help/tutorials/spriting.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index dfd4fd5c..d6f8587b 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -60,6 +60,7 @@ Set the `$-layout` variable to the preferred layout method. * vertical - default * horizontal - lays images out side by side * diagonal - lays images out corner to corner none of the spacing of padding options are taken into account +* smart - lays the images out using a bin packing algorithm which allows for much smaller surface areas in your sprite files Example: From e49581c18f1fa19c55954000377b497e47dcb9d3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:37:59 -0400 Subject: [PATCH 057/290] smart pack docs - forgot something --- Gemfile.lock | 2 +- doc-src/content/help/tutorials/spriting.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a3433dd2..24843a91 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.ec7c4b2) + compass (0.12.0.alpha.0.5f2cf88) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index d6f8587b..b5c3d6ba 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -60,7 +60,7 @@ Set the `$-layout` variable to the preferred layout method. * vertical - default * horizontal - lays images out side by side * diagonal - lays images out corner to corner none of the spacing of padding options are taken into account -* smart - lays the images out using a bin packing algorithm which allows for much smaller surface areas in your sprite files +* smart - lays the images out using a bin packing algorithm which allows for much smaller surface areas in your sprite files - does not support spacing or padding Example: From 6a166d0145472d8f9b00d514b77723a1fba07542 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 2 Aug 2011 23:46:03 -0400 Subject: [PATCH 058/290] derp double require --- Gemfile.lock | 2 +- lib/compass/sass_extensions/sprites/layout_methods.rb | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 24843a91..d9559e14 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.5f2cf88) + compass (0.12.0.alpha.0.e49581c) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 5a030231..2b6a6142 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -23,8 +23,6 @@ module Compass def compute_image_positions! case @kwargs.get_var('layout').value when SMART - require 'compass/sass_extensions/sprites/image_row' - require 'compass/sass_extensions/sprites/row_fitter' calculate_smart_positions when DIAGONAL calculate_diagonal_dimensions From d8e43bfdd7f43796d52f82cacbe92dc379beb44a Mon Sep 17 00:00:00 2001 From: Tyrinslys Valinlore Date: Wed, 3 Aug 2011 11:13:12 -0400 Subject: [PATCH 059/290] Changed the descriptions of the sin, cos, and tan to be more descriptive. --- .../content/reference/compass/helpers/trig.haml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/doc-src/content/reference/compass/helpers/trig.haml b/doc-src/content/reference/compass/helpers/trig.haml index 2147d2b2..2e574ccc 100644 --- a/doc-src/content/reference/compass/helpers/trig.haml +++ b/doc-src/content/reference/compass/helpers/trig.haml @@ -35,8 +35,9 @@ documented_functions: sin($number) .details %p - Takes the sine of a number. If the number is unitless or has a unit of deg - then it will return a unitless result. Degrees will first be converted to radians. + Returns the sine of a number. If the number is unitless or has a unit of deg + then it will return a unitless result. Unless the number has a unit of deg it + will be evaluated as radians. Degrees will first be converted to radians. If the number is any other unit, the units will be passed thru to the result, and the number will be treated as radians. @@ -46,8 +47,9 @@ documented_functions: cos($number) .details %p - Takes the cosine of a number. If the number is unitless or has a unit of deg - then it will return a unitless result. Degrees will first be converted to radians. + Returns the cosine of a number. If the number is unitless or has a unit of deg + then it will return a unitless result. Unless the number has a unit of deg it + will be evaluated as radians. Degrees will first be converted to radians. If the number is any other unit, the units will be passed thru to the result, and the number will be treated as radians. #tan.helper @@ -56,7 +58,8 @@ documented_functions: tan($number) .details %p - Takes the tangent of a number. If the number is unitless or has a unit of deg - then it will return a unitless result. Degrees will first be converted to radians. + Returns the tangent of a number. If the number is unitless or has a unit of deg + then it will return a unitless result. Unless the number has a unit of deg it + will be evaluated as radians. Degrees will first be converted to radians. If the number is any other unit, the units will be passed thru to the result, and the number will be treated as radians. From 4aa052d9e43c1fac142b0c8ce4be1ae388274ca3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 12 Aug 2011 15:12:31 -0400 Subject: [PATCH 060/290] horizontal layout now respects positions and spacing correctly --- Gemfile.lock | 2 +- lib/compass/sass_extensions/sprites/image.rb | 23 +++--- .../sass_extensions/sprites/layout_methods.rb | 2 +- test/units/sprites/image_test.rb | 75 ++++++++----------- test/units/sprites/sprite_map_test.rb | 24 +++++- 5 files changed, 69 insertions(+), 57 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d9559e14..a4e40f94 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.e49581c) + compass (0.12.0.alpha.0.d8e43bf) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/sprites/image.rb b/lib/compass/sass_extensions/sprites/image.rb index fc842b3d..1b41b18f 100644 --- a/lib/compass/sass_extensions/sprites/image.rb +++ b/lib/compass/sass_extensions/sprites/image.rb @@ -48,29 +48,28 @@ module Compass File.basename(relative_file, '.png') end - # Value of $#{name}-repeat or $repeat - def repeat - [ "#{name}-repeat", "repeat" ].each { |which| - if var = options.get_var(which) - return var.value - end - } - "no-repeat" + def get_var_file(var) + options.get_var "#{name}_#{var}" end - # Value of $#{name}-position or $position defaults o 0px + # Value of $#{name}-repeat or $repeat + def repeat + (get_var_file("repeat") || options.get_var("repeat") || Sass::Script::String.new("no-repeat")).value + end + + # Value of $#{name}-position or $position defaults to 0px def position - options.get_var("#{name}-position") || options.get_var("position") || Sass::Script::Number.new(0, ["px"]) + get_var_file("position") || options.get_var("position") || Sass::Script::Number.new(0, ["px"]) end # Offset within the sprite def offset (position.unitless? || position.unit_str == "px") ? position.value : 0 end - + # Spacing between this image and the next def spacing - (options.get_var("#{name}-spacing") || options.get_var("spacing") || Sass::Script::Number.new(0)).value + (get_var_file("spacing") || options.get_var("spacing") || Sass::Script::Number.new(0, ['px'])).value end # MD5 hash of this file diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 2b6a6142..60da675c 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -81,7 +81,7 @@ module Compass image.top = image.position.unit_str == '%' ? (@height - image.height) * (image.position.value / 100.0) : image.position.value next if index == 0 last_image = @images[index-1] - image.left = last_image.left + last_image.width + [image.offset, last_image.offset].max + image.left = last_image.left + last_image.width + [image.spacing, last_image.spacing].max end end diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index a3342138..ffac255d 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -6,41 +6,36 @@ class SpritesImageTest < Test::Unit::TestCase include SpriteHelper def setup create_sprite_temp - file = StringIO.new("images_path = #{@images_src_path.inspect}\n") - Compass.add_configuration(file, "sprite_config") - @repeat = 'no-repeat' - @spacing = 0 - @position = 100 - @offset = 100 end - let(:sprite_filename) { 'squares/ten-by-ten.png' } - let(:sprite_path) { File.join(@images_tmp_path, sprite_filename) } - let(:sprite_name) { File.basename(sprite_filename, '.png') } + SPRITE_FILENAME = 'selectors/ten-by-ten.png' - - def options - options = {:offset => @offset} - options.stubs(:get_var).with(anything).returns(nil) - ::OpenStruct.any_instance.stubs(:unitless?).returns(true) - options.stubs(:get_var).with("#{sprite_name}-repeat").returns(::OpenStruct.new(:value => @repeat)) - options.stubs(:get_var).with("#{sprite_name}-spacing").returns(::OpenStruct.new(:value => @spacing)) - options.stubs(:get_var).with("#{sprite_name}-position").returns(::OpenStruct.new(:value => @position)) - options.stubs(:get_var).with("layout").returns(::OpenStruct.new(:value => 'vertical')) - options + def sprite_path + File.join(@images_tmp_path, SPRITE_FILENAME) end - + def sprite_name + File.basename(SPRITE_FILENAME, '.png') + end - let(:digest) { Digest::MD5.file(sprite_path).hexdigest } - - - let(:image) { Compass::SassExtensions::Sprites::Image.new(sprite_map_test(options), File.join(sprite_filename), options)} + def digest + Digest::MD5.file(sprite_path).hexdigest + end + + def test_map(options ={}) + options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')}.merge(options) + map = sprite_map_test(options) + end + + def test_image(options ={}) + test_map(options).images.first + end test 'initialize' do + image = test_image assert_equal sprite_name, image.name assert_equal sprite_path, image.file - assert_equal sprite_filename, image.relative_file + assert_equal SPRITE_FILENAME, image.relative_file assert_equal 10, image.width assert_equal 10, image.height assert_equal digest, image.digest @@ -49,44 +44,40 @@ class SpritesImageTest < Test::Unit::TestCase end test 'hover' do - assert_equal 'ten-by-ten_hover', image.hover.name + assert_equal 'ten-by-ten_hover', test_image.hover.name end test 'no parent' do - assert_nil image.parent + assert_nil test_image.parent end - - test 'image type is nil' do - @repeat = nil - assert_nil image.repeat - end - test 'image type is "global"' do - @repeat = 'global' - assert_equal @repeat, image.repeat + image = test_image "ten_by_ten_repeat" => Sass::Script::String.new('global') + assert_equal 'global', image.repeat end test 'image type is "no-repeat"' do - assert_equal 'no-repeat', image.repeat + assert_equal 'no-repeat', test_image.repeat end test 'image position' do - assert_equal Sass::Script::Number.new(100, ["px"]).value, image.position.value + image = test_image "ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) + assert_equal 100, image.position.value end test 'image spacing' do @spacing = 10 - assert_equal @spacing, image.spacing + image = test_image "spacing" => Sass::Script::Number.new(100, ["px"]) + assert_equal 100, image.spacing end test 'offset' do - assert_equal @offset, image.offset + image = test_image "ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) + assert_equal 100, image.offset end test 'neither, uses 0' do - @offset = 0 - img = image + img = test_image img.position.stubs(:unitless?).returns(false) assert_equal 0, img.offset end @@ -105,7 +96,7 @@ class SpritesImageTest < Test::Unit::TestCase config.images_path = @images_tmp_path config.sprite_load_path = [@images_tmp_path, other_folder] Compass.add_configuration(config, "sprite_config") - image = Compass::SassExtensions::Sprites::Image.new(sprite_map_test(options), "foo/my.png", options) + image = Compass::SassExtensions::Sprites::Image.new(test_map, "foo/my.png", {}) assert_equal File.join(other_folder, 'foo/my.png'), image.file assert_equal 0, image.size FileUtils.rm_rf other_folder diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 30b601b9..b9f4a0ef 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -86,6 +86,16 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal [0, 0, 0, 0], @base.images.map(&:left) end + it "should have a vertical layout with spacing" do + base = sprite_map_test(@options.merge({"spacing" => Sass::Script::Number.new(10, ['px'])})) + assert_equal [0, 20, 40, 60], base.images.map(&:top) + end + + it "should layout vertical with position" do + base = sprite_map_test("ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 10, 0, 0], base.images.map(&:left) + end + def smart options = @options.merge("layout" => Sass::Script::String.new('smart')) importer = Compass::SpriteImporter.new @@ -122,8 +132,9 @@ class SpriteMapTest < Test::Unit::TestCase end # Horizontal tests - def horizontal + def horizontal(options= {}) opts = @options.merge("layout" => Sass::Script::String.new('horizontal')) + opts.merge!(options) sprite_map_test(opts) end @@ -139,6 +150,17 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal [0, 0, 0, 0], base.images.map(&:top) end + it "should layout horizontaly with spacing" do + base = horizontal("spacing" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 20, 40, 60], base.images.map(&:left) + assert_equal [0, 0, 0, 0], base.images.map(&:top) + end + + it "should layout horizontaly with position" do + base = horizontal("ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 10, 0, 0], base.images.map(&:top) + end + it "should generate a horrizontal sprite" do base = horizontal base.generate From 1cdfab7c0308f83352163ef5891c03e3a6753eab Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 12 Aug 2011 15:34:04 -0400 Subject: [PATCH 061/290] fixed horizontal height and width calculation --- lib/compass/sass_extensions/sprites/layout_methods.rb | 4 ++-- test/units/sprites/sprite_map_test.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 60da675c..258328ac 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -100,11 +100,11 @@ module Compass end def height_for_horizontal_layout - @height = @images.map {|image| image.height + image.spacing}.max + @height = @images.map {|image| image.height + image.offset}.max end def width_for_horizontal_layout - @images.inject(0) { |sum, image| sum += (image.width + image.offset) } + @images.inject(0) { |sum, image| sum += (image.width + image.spacing) } end def width_for_vertical_layout diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index b9f4a0ef..8360b086 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -154,6 +154,7 @@ class SpriteMapTest < Test::Unit::TestCase base = horizontal("spacing" => Sass::Script::Number.new(10, ['px'])) assert_equal [0, 20, 40, 60], base.images.map(&:left) assert_equal [0, 0, 0, 0], base.images.map(&:top) + assert_equal 80, base.width end it "should layout horizontaly with position" do From a82a3dd5d4a26d3716cedf7ead4690ae9ace4fef Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 19 Aug 2011 17:04:32 -0400 Subject: [PATCH 062/290] updated change log --- doc-src/content/CHANGELOG.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index c6573794..038f5096 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,6 +14,14 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.0 pending +------------------- +* Added support for diagonal, horizontal, and smart sprite layout +* Fixed a bug with spacing in horizontal layout +* Changed the descriptions of the sin, cos, and tan to be more descriptive +* Fixed trig functions via issue #498 +* Fixed the default `http_path` in rails +* Sprites can now have a `sprite_seach_path` that is an array of directories that contain source images for sprites handy for using sprites in extensions of gems 0.11.5 (07/10/2011) ------------------- From 4187f889700abf570302f0f96360c0e37cfe8368 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 19 Aug 2011 19:55:55 -0400 Subject: [PATCH 063/290] fixed a bug that was causeing compass to remove non sprite images --- lib/compass/sprite_importer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 6b8f2d94..e2a775d2 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -7,7 +7,7 @@ module Compass # finds all sprite files def self.find_all_sprite_map_files(path) hex = "[0-9a-f]" - glob = "*-{,s}#{hex*10}{#{VALID_EXTENSIONS.join(",")}}" + glob = "*-s#{hex*10}{#{VALID_EXTENSIONS.join(",")}}" Dir.glob(File.join(path, "**", glob)) end From f23bf58e8db84e17e6fab37cc73e5a539924cca0 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 20 Aug 2011 17:22:50 -0700 Subject: [PATCH 064/290] Add support for a separate output location for generated images. This is necessary for rails 3.1 support of sprites. --- doc-src/content/CHANGELOG.markdown | 12 +++- .../configuration-reference.markdown | 24 +++++++- .../reference/compass/helpers/urls.haml | 27 +++++++-- lib/compass/commands/clean_project.rb | 2 +- lib/compass/configuration.rb | 1 + lib/compass/configuration/defaults.rb | 19 +++++++ .../sass_extensions/functions/sprites.rb | 4 +- lib/compass/sass_extensions/functions/urls.rb | 57 ++++++++++++++++++- .../sass_extensions/sprites/sprite_methods.rb | 3 +- test/integrations/sprites_test.rb | 31 ++++++++++ 10 files changed, 167 insertions(+), 13 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 038f5096..0370eca9 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,14 +14,22 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.0 pending +0.12.0 (UNRELEASED) ------------------- * Added support for diagonal, horizontal, and smart sprite layout * Fixed a bug with spacing in horizontal layout * Changed the descriptions of the sin, cos, and tan to be more descriptive * Fixed trig functions via issue #498 * Fixed the default `http_path` in rails -* Sprites can now have a `sprite_seach_path` that is an array of directories that contain source images for sprites handy for using sprites in extensions of gems +* Sprites can now have a `sprite_seach_path` that is an array of directories that + contain source images for sprites handy for using sprites in extensions of gems +* Added a new set of configuration properties for generated images. + `generated_images_dir`, `generated_images_path`, `http_generated_images_dir`, + and `http_generated_images_path` can now be set to control where generated + images are written and how they are served. Added a corresponding + `generated-image-url()` helper function. These should rarely be needed and + will default to your corresponding image directories and paths. + 0.11.5 (07/10/2011) ------------------- diff --git a/doc-src/content/help/tutorials/configuration-reference.markdown b/doc-src/content/help/tutorials/configuration-reference.markdown index 02682243..66808bf7 100644 --- a/doc-src/content/help/tutorials/configuration-reference.markdown +++ b/doc-src/content/help/tutorials/configuration-reference.markdown @@ -170,11 +170,33 @@ later on. http_images_path - String + String The full http path to images on the web server. Defaults to http_path + "/" + images_dir. + + generated_images_dir + String + The directory where generated images are kept. + It is relative to the project_path. + Defaults to the value of images_dir. + + + + generated_images_path + String + The full path to where generated images are kept. + Defaults to the value of <project_path>/<generated_images_dir>. + + + + http_generated_images_path + String + The full http path to generated images on + the web server. Defaults to http_path + "/" + generated_images_dir. + + javascripts_dir String diff --git a/doc-src/content/reference/compass/helpers/urls.haml b/doc-src/content/reference/compass/helpers/urls.haml index da1d7853..961fbd44 100644 --- a/doc-src/content/reference/compass/helpers/urls.haml +++ b/doc-src/content/reference/compass/helpers/urls.haml @@ -12,6 +12,7 @@ documented_functions: - "stylesheet-url" - "font-url" - "image-url" + - "generated-image-url" --- %h1 Compass URL Helpers @@ -31,7 +32,7 @@ documented_functions: Generates a path to an asset found relative to the project's css directory. %br Passing a true value as the second argument will cause the only the path to be returned - instead of a `url()` function + instead of a url() function #font-url.helper %h3 @@ -42,7 +43,7 @@ documented_functions: Generates a path to an asset found relative to the project's font directory. %br Passing a true value as the second argument will cause the only the path to be returned - instead of a `url()` function + instead of a url() function #image-url.helper %h3 @@ -53,9 +54,27 @@ documented_functions: Generates a path to an asset found relative to the project's images directory. %p Passing a true value as the second argument will cause the only the path to be returned - instead of a `url()` function + instead of a url() function %p The third argument is used to control the cache buster on a per-use basis. - When set to `false` no cache buster will be used. When a string, that + When set to false no cache buster will be used. When a string, that value will be used as the cache buster. +#generated-image-url.helper + %h3 + %a(href="#generated-image-url") + generated-image-url($path, $cache-buster: false) + .details + %p + Generates a path to an image generated during compilation using the + generated_image related configuration properties. + %p + Most users will never call this helper directly, it is primarily provided + for use by plugins that need to generate paths to images they create. E.g. + The sprite-url() helper calls this helper. + %p + The second argument is used to control the cache buster on a per-use basis. + Defaults to false, meaning that no cache buster will be used. + When a string, that value will be used as the cache buster, when true + Compass will generate a cache-buster based on the image's modification time. + diff --git a/lib/compass/commands/clean_project.rb b/lib/compass/commands/clean_project.rb index e6792326..7a082380 100644 --- a/lib/compass/commands/clean_project.rb +++ b/lib/compass/commands/clean_project.rb @@ -30,7 +30,7 @@ module Compass def perform compiler = new_compiler_instance compiler.clean! - Compass::SpriteImporter.find_all_sprite_map_files(Compass.configuration.images_path).each do |sprite| + Compass::SpriteImporter.find_all_sprite_map_files(Compass.configuration.generated_images_path).each do |sprite| remove sprite end end diff --git a/lib/compass/configuration.rb b/lib/compass/configuration.rb index 91793a5c..7ad8291a 100644 --- a/lib/compass/configuration.rb +++ b/lib/compass/configuration.rb @@ -20,6 +20,7 @@ module Compass attributes_for_directory(:css, :stylesheets), attributes_for_directory(:sass, nil), attributes_for_directory(:images), + attributes_for_directory(:generated_images), attributes_for_directory(:javascripts), attributes_for_directory(:fonts), attributes_for_directory(:extensions, nil), diff --git a/lib/compass/configuration/defaults.rb b/lib/compass/configuration/defaults.rb index 97f8931e..2d6046c1 100644 --- a/lib/compass/configuration/defaults.rb +++ b/lib/compass/configuration/defaults.rb @@ -60,6 +60,14 @@ module Compass end end + def default_generated_images_path + if (pp = top_level.project_path) && (dir = top_level.generated_images_dir) + Compass.projectize(dir, pp) + else + top_level.images_path + end + end + def default_javascripts_path if (pp = top_level.project_path) && (dir = top_level.javascripts_dir) Compass.projectize(dir, pp) @@ -84,6 +92,13 @@ module Compass end end + def default_generated_images_dir + top_level.images_dir + end + + def default_http_generated_images_dir + top_level.http_images_dir + end def default_http_images_dir top_level.images_dir @@ -105,6 +120,10 @@ module Compass http_root_relative top_level.http_stylesheets_dir end + def default_http_generated_images_path + http_root_relative top_level.http_generated_images_dir + end + def default_http_fonts_dir if fd = top_level.fonts_dir_without_default fd diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index d2f74b61..03542ad0 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -96,9 +96,7 @@ module Compass::SassExtensions::Functions::Sprites def sprite_url(map) verify_map(map, "sprite-url") map.generate - image_url(Sass::Script::String.new("#{map.path}-s#{map.uniqueness_hash}.png"), - Sass::Script::Bool.new(false), - Sass::Script::Bool.new(false)) + generated_image_url(Sass::Script::String.new("#{map.path}-s#{map.uniqueness_hash}.png")) end Sass::Script::Functions.declare :sprite_url, [:map] diff --git a/lib/compass/sass_extensions/functions/urls.rb b/lib/compass/sass_extensions/functions/urls.rb index 50ffab52..581a080a 100644 --- a/lib/compass/sass_extensions/functions/urls.rb +++ b/lib/compass/sass_extensions/functions/urls.rb @@ -2,7 +2,7 @@ module Compass::SassExtensions::Functions::Urls def stylesheet_url(path, only_path = Sass::Script::Bool.new(false)) # Compute the path to the stylesheet, either root relative or stylesheet relative - # or nil if the http_images_path is not set in the configuration. + # or nil if the http_stylesheets_path is not set in the configuration. http_stylesheets_path = if relative? compute_relative_path(Compass.configuration.css_path) elsif Compass.configuration.http_stylesheets_path @@ -108,6 +108,61 @@ module Compass::SassExtensions::Functions::Urls Sass::Script::Functions.declare :image_url, [:path, :only_path] Sass::Script::Functions.declare :image_url, [:path, :only_path, :cache_buster] + def generated_image_url(path, cache_buster = Sass::Script::Bool.new(false)) + path = path.value # get to the string value of the literal. + + if path =~ %r{^#{Regexp.escape(Compass.configuration.http_generated_images_path)}/(.*)} + # Treat root relative urls (without a protocol) like normal if they start with + # the generated_images path. + path = $1 + elsif absolute_path?(path) + # Short curcuit if they have provided an absolute url. + return Sass::Script::String.new("url(#{path})") + end + + # Compute the path to the image, either root relative or stylesheet relative + # or nil if the http_generated_images_path is not set in the configuration. + http_generated_images_path = if relative? + compute_relative_path(Compass.configuration.generated_images_path) + elsif Compass.configuration.http_generated_images_path + Compass.configuration.http_generated_images_path + else + Compass.configuration.http_root_relative(Compass.configuration.generated_images_dir) + end + + # Compute the real path to the image on the file stystem if the generated_images_dir is set. + real_path = if Compass.configuration.generated_images_dir + File.join(Compass.configuration.project_path, Compass.configuration.generated_images_dir, path) + end + + # prepend the path to the image if there's one + if http_generated_images_path + http_generated_images_path = "#{http_generated_images_path}/" unless http_generated_images_path[-1..-1] == "/" + path = "#{http_generated_images_path}#{path}" + end + + # Compute the asset host unless in relative mode. + asset_host = if !relative? && Compass.configuration.asset_host + Compass.configuration.asset_host.call(path) + end + + # Compute and append the cache buster if there is one. + if cache_buster.to_bool + if cache_buster.is_a?(Sass::Script::String) + path += "?#{cache_buster.value}" + else + path = cache_busted_path(path, real_path) + end + end + + # prepend the asset host if there is one. + path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host + + clean_url(path) + end + Sass::Script::Functions.declare :generated_image_url, [:path] + Sass::Script::Functions.declare :generated_image_url, [:path, :cache_buster] + private # Emits a path, taking off any leading "./" diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 7fdec149..36cf76ed 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -43,7 +43,7 @@ module Compass # The on-the-disk filename of the sprite def filename - File.join(Compass.configuration.images_path, "#{path}-s#{uniqueness_hash}.png") + File.join(Compass.configuration.generated_images_path, "#{path}-s#{uniqueness_hash}.png") end # Generate a sprite image if necessary @@ -87,6 +87,7 @@ module Compass # Saves the sprite engine def save! + FileUtils.mkdir_p(File.dirname(filename)) saved = engine.save(filename) Compass.configuration.run_callback(:sprite_saved, filename) saved diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 3db8e640..e099bc05 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -11,6 +11,7 @@ class SpritesTest < Test::Unit::TestCase Compass.reset_configuration! @images_src_path = File.join(File.dirname(__FILE__), '..', 'fixtures', 'sprites', 'public', 'images') @images_tmp_path = File.join(File.dirname(__FILE__), '..', 'fixtures', 'sprites', 'public', 'images-tmp') + @generated_images_tmp_path = File.join(File.dirname(__FILE__), '..', 'fixtures', 'sprites', 'public', 'generated-images-tmp') ::FileUtils.cp_r @images_src_path, @images_tmp_path file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n") Compass.add_configuration(file, "sprite_config") @@ -20,6 +21,7 @@ class SpritesTest < Test::Unit::TestCase def teardown Compass.reset_configuration! ::FileUtils.rm_r @images_tmp_path + ::FileUtils.rm_rf @generated_images_tmp_path end @@ -74,6 +76,35 @@ class SpritesTest < Test::Unit::TestCase assert_equal image_md5('squares-s*.png'), '7349a0f4e88ea80abddcf6ac2486abe3' end + it "should output and serve sprite files using the generated images directory" do + Compass.reset_configuration! + file = StringIO.new(<<-CONFIG) + images_path = #{@images_tmp_path.inspect} + generated_images_path = #{@generated_images_tmp_path.inspect} + http_generated_images_path = "/images/generated" + CONFIG + Compass.add_configuration(file, "sprite_config") + Compass.configure_sass_plugin! + css = render <<-SCSS + @import "squares/*.png"; + @include all-squares-sprites; + SCSS + assert_not_nil Dir.glob("#{@generated_images_tmp_path}/squares-s*.png").first + assert_correct <<-CSS, css + .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { + background: url('/images/generated/squares-s161c60ad78.png') no-repeat; + } + + .squares-ten-by-ten { + background-position: 0 0; + } + + .squares-twenty-by-twenty { + background-position: 0 -10px; + } + CSS + end + it "should generate sprite classes with dimensions" do css = render <<-SCSS $squares-sprite-dimensions: true; From 210a1d4771c9ee1846ac5664875a62d085216aec Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 27 Aug 2011 15:38:38 +0800 Subject: [PATCH 065/290] only define the compass url helpers if they are not already defined. --- lib/compass/sass_extensions/functions/urls.rb | 336 ++++++++++-------- test/units/sass_extensions_test.rb | 14 + 2 files changed, 200 insertions(+), 150 deletions(-) diff --git a/lib/compass/sass_extensions/functions/urls.rb b/lib/compass/sass_extensions/functions/urls.rb index 581a080a..f72cdeb0 100644 --- a/lib/compass/sass_extensions/functions/urls.rb +++ b/lib/compass/sass_extensions/functions/urls.rb @@ -1,167 +1,203 @@ module Compass::SassExtensions::Functions::Urls - def stylesheet_url(path, only_path = Sass::Script::Bool.new(false)) - # Compute the path to the stylesheet, either root relative or stylesheet relative - # or nil if the http_stylesheets_path is not set in the configuration. - http_stylesheets_path = if relative? - compute_relative_path(Compass.configuration.css_path) - elsif Compass.configuration.http_stylesheets_path - Compass.configuration.http_stylesheets_path - else - Compass.configuration.http_root_relative(Compass.configuration.css_dir) - end - path = "#{http_stylesheets_path}/#{path.value}" - if only_path.to_bool - Sass::Script::String.new(clean_path(path)) - else - clean_url(path) - end + def self.has?(base, instance_method) + Sass::Util.has?(:instance_method, base, instance_method) end - Sass::Script::Functions.declare :stylesheet_url, [:path] - Sass::Script::Functions.declare :stylesheet_url, [:path, :only_path] - def font_url(path, only_path = Sass::Script::Bool.new(false)) - path = path.value # get to the string value of the literal. - - # Short curcuit if they have provided an absolute url. - if absolute_path?(path) - return Sass::Script::String.new("url(#{path})") - end - - # Compute the path to the font file, either root relative or stylesheet relative - # or nil if the http_fonts_path cannot be determined from the configuration. - http_fonts_path = if relative? - compute_relative_path(Compass.configuration.fonts_path) - else - Compass.configuration.http_fonts_path - end - - path = "#{http_fonts_path}/#{path}" - - if only_path.to_bool - Sass::Script::String.new(clean_path(path)) - else - clean_url(path) - end + def self.included(base) + base.send(:include, StylesheetUrl) unless has?(base, :stylesheet_url) + base.send(:include, FontUrl) unless has?(base, :font_url) + base.send(:include, ImageUrl) unless has?(base, :image_url) + base.send(:include, GeneratedImageUrl) unless has?(base, :generated_image_url) end - Sass::Script::Functions.declare :font_url, [:path] - Sass::Script::Functions.declare :font_url, [:path, :only_path] - def image_url(path, only_path = Sass::Script::Bool.new(false), cache_buster = Sass::Script::Bool.new(true)) - path = path.value # get to the string value of the literal. - - if path =~ %r{^#{Regexp.escape(Compass.configuration.http_images_path)}/(.*)} - # Treat root relative urls (without a protocol) like normal if they start with - # the images path. - path = $1 - elsif absolute_path?(path) - # Short curcuit if they have provided an absolute url. - return Sass::Script::String.new("url(#{path})") - end - - # Compute the path to the image, either root relative or stylesheet relative - # or nil if the http_images_path is not set in the configuration. - http_images_path = if relative? - compute_relative_path(Compass.configuration.images_path) - elsif Compass.configuration.http_images_path - Compass.configuration.http_images_path - else - Compass.configuration.http_root_relative(Compass.configuration.images_dir) - end - - # Compute the real path to the image on the file stystem if the images_dir is set. - real_path = if Compass.configuration.images_dir - File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path) - end - - # prepend the path to the image if there's one - if http_images_path - http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/" - path = "#{http_images_path}#{path}" - end - - # Compute the asset host unless in relative mode. - asset_host = if !relative? && Compass.configuration.asset_host - Compass.configuration.asset_host.call(path) - end - - # Compute and append the cache buster if there is one. - if cache_buster.to_bool - if cache_buster.is_a?(Sass::Script::String) - path += "?#{cache_buster.value}" - else - path = cache_busted_path(path, real_path) + module StylesheetUrl + def self.included(base) + if base.respond_to?(:declare) + base.declare :stylesheet_url, [:path] + base.declare :stylesheet_url, [:path, :only_path] end end + def stylesheet_url(path, only_path = Sass::Script::Bool.new(false)) + # Compute the path to the stylesheet, either root relative or stylesheet relative + # or nil if the http_images_path is not set in the configuration. + http_stylesheets_path = if relative? + compute_relative_path(Compass.configuration.css_path) + elsif Compass.configuration.http_stylesheets_path + Compass.configuration.http_stylesheets_path + else + Compass.configuration.http_root_relative(Compass.configuration.css_dir) + end - # prepend the asset host if there is one. - path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host + path = "#{http_stylesheets_path}/#{path.value}" + if only_path.to_bool + Sass::Script::String.new(clean_path(path)) + else + clean_url(path) + end + end + end + + module FontUrl + def self.included(base) + if base.respond_to?(:declare) + base.declare :font_url, [:path] + base.declare :font_url, [:path, :only_path] + end + end + def font_url(path, only_path = Sass::Script::Bool.new(false)) + path = path.value # get to the string value of the literal. + + # Short curcuit if they have provided an absolute url. + if absolute_path?(path) + return Sass::Script::String.new("url(#{path})") + end + + # Compute the path to the font file, either root relative or stylesheet relative + # or nil if the http_fonts_path cannot be determined from the configuration. + http_fonts_path = if relative? + compute_relative_path(Compass.configuration.fonts_path) + else + Compass.configuration.http_fonts_path + end + + path = "#{http_fonts_path}/#{path}" + + if only_path.to_bool + Sass::Script::String.new(clean_path(path)) + else + clean_url(path) + end + end + end + + module ImageUrl + def self.included(base) + if base.respond_to?(:declare) + base.declare :image_url, [:path] + base.declare :image_url, [:path, :only_path] + base.declare :image_url, [:path, :only_path, :cache_buster] + end + end + def image_url(path, only_path = Sass::Script::Bool.new(false), cache_buster = Sass::Script::Bool.new(true)) + path = path.value # get to the string value of the literal. + + if path =~ %r{^#{Regexp.escape(Compass.configuration.http_images_path)}/(.*)} + # Treat root relative urls (without a protocol) like normal if they start with + # the images path. + path = $1 + elsif absolute_path?(path) + # Short curcuit if they have provided an absolute url. + return Sass::Script::String.new("url(#{path})") + end + + # Compute the path to the image, either root relative or stylesheet relative + # or nil if the http_images_path is not set in the configuration. + http_images_path = if relative? + compute_relative_path(Compass.configuration.images_path) + elsif Compass.configuration.http_images_path + Compass.configuration.http_images_path + else + Compass.configuration.http_root_relative(Compass.configuration.images_dir) + end + + # Compute the real path to the image on the file stystem if the images_dir is set. + real_path = if Compass.configuration.images_dir + File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path) + end + + # prepend the path to the image if there's one + if http_images_path + http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/" + path = "#{http_images_path}#{path}" + end + + # Compute the asset host unless in relative mode. + asset_host = if !relative? && Compass.configuration.asset_host + Compass.configuration.asset_host.call(path) + end + + # Compute and append the cache buster if there is one. + if cache_buster.to_bool + if cache_buster.is_a?(Sass::Script::String) + path += "?#{cache_buster.value}" + else + path = cache_busted_path(path, real_path) + end + end + + # prepend the asset host if there is one. + path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host + + if only_path.to_bool + Sass::Script::String.new(clean_path(path)) + else + clean_url(path) + end + end + end + + module GeneratedImageUrl + def self.included(base) + if base.respond_to?(:declare) + base.declare :generated_image_url, [:path] + base.declare :generated_image_url, [:path, :cache_buster] + end + end + def generated_image_url(path, cache_buster = Sass::Script::Bool.new(false)) + path = path.value # get to the string value of the literal. + + if path =~ %r{^#{Regexp.escape(Compass.configuration.http_generated_images_path)}/(.*)} + # Treat root relative urls (without a protocol) like normal if they start with + # the generated_images path. + path = $1 + elsif absolute_path?(path) + # Short curcuit if they have provided an absolute url. + return Sass::Script::String.new("url(#{path})") + end + + # Compute the path to the image, either root relative or stylesheet relative + # or nil if the http_generated_images_path is not set in the configuration. + http_generated_images_path = if relative? + compute_relative_path(Compass.configuration.generated_images_path) + elsif Compass.configuration.http_generated_images_path + Compass.configuration.http_generated_images_path + else + Compass.configuration.http_root_relative(Compass.configuration.generated_images_dir) + end + + # Compute the real path to the image on the file stystem if the generated_images_dir is set. + real_path = if Compass.configuration.generated_images_dir + File.join(Compass.configuration.project_path, Compass.configuration.generated_images_dir, path) + end + + # prepend the path to the image if there's one + if http_generated_images_path + http_generated_images_path = "#{http_generated_images_path}/" unless http_generated_images_path[-1..-1] == "/" + path = "#{http_generated_images_path}#{path}" + end + + # Compute the asset host unless in relative mode. + asset_host = if !relative? && Compass.configuration.asset_host + Compass.configuration.asset_host.call(path) + end + + # Compute and append the cache buster if there is one. + if cache_buster.to_bool + if cache_buster.is_a?(Sass::Script::String) + path += "?#{cache_buster.value}" + else + path = cache_busted_path(path, real_path) + end + end + + # prepend the asset host if there is one. + path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host - if only_path.to_bool - Sass::Script::String.new(clean_path(path)) - else clean_url(path) end end - Sass::Script::Functions.declare :image_url, [:path] - Sass::Script::Functions.declare :image_url, [:path, :only_path] - Sass::Script::Functions.declare :image_url, [:path, :only_path, :cache_buster] - - def generated_image_url(path, cache_buster = Sass::Script::Bool.new(false)) - path = path.value # get to the string value of the literal. - - if path =~ %r{^#{Regexp.escape(Compass.configuration.http_generated_images_path)}/(.*)} - # Treat root relative urls (without a protocol) like normal if they start with - # the generated_images path. - path = $1 - elsif absolute_path?(path) - # Short curcuit if they have provided an absolute url. - return Sass::Script::String.new("url(#{path})") - end - - # Compute the path to the image, either root relative or stylesheet relative - # or nil if the http_generated_images_path is not set in the configuration. - http_generated_images_path = if relative? - compute_relative_path(Compass.configuration.generated_images_path) - elsif Compass.configuration.http_generated_images_path - Compass.configuration.http_generated_images_path - else - Compass.configuration.http_root_relative(Compass.configuration.generated_images_dir) - end - - # Compute the real path to the image on the file stystem if the generated_images_dir is set. - real_path = if Compass.configuration.generated_images_dir - File.join(Compass.configuration.project_path, Compass.configuration.generated_images_dir, path) - end - - # prepend the path to the image if there's one - if http_generated_images_path - http_generated_images_path = "#{http_generated_images_path}/" unless http_generated_images_path[-1..-1] == "/" - path = "#{http_generated_images_path}#{path}" - end - - # Compute the asset host unless in relative mode. - asset_host = if !relative? && Compass.configuration.asset_host - Compass.configuration.asset_host.call(path) - end - - # Compute and append the cache buster if there is one. - if cache_buster.to_bool - if cache_buster.is_a?(Sass::Script::String) - path += "?#{cache_buster.value}" - else - path = cache_busted_path(path, real_path) - end - end - - # prepend the asset host if there is one. - path = "#{asset_host}#{'/' unless path[0..0] == "/"}#{path}" if asset_host - - clean_url(path) - end - Sass::Script::Functions.declare :generated_image_url, [:path] - Sass::Script::Functions.declare :generated_image_url, [:path, :cache_buster] private diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 8b8aeabd..372d54e6 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -98,6 +98,20 @@ class SassExtensionsTest < Test::Unit::TestCase assert_equal "true", evaluate("prefixed(-css2, css2-fallback(css3, css2))") end + %w(stylesheet_url font_url image_url generated_image_url).each do |helper| + class_eval %Q{ + def test_#{helper}_helper_defers_to_existing_helper + c = Class.new do + def #{helper}(*args) + :original + end + end + c.send(:include, Compass::SassExtensions::Functions::Urls) + assert_equal :original, c.new.#{helper}("logo.png") + end + } + end + protected def evaluate(value) Sass::Script::Parser.parse(value, 0, 0).perform(Sass::Environment.new).to_s From 7d743941d15ab4e126349e74437de649d88acb8f Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 23:36:59 +0800 Subject: [PATCH 066/290] fix error message --- lib/compass/app_integration/rails/actionpack31/helpers.rb | 5 +++++ lib/compass/sass_extensions/functions/sprites.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 lib/compass/app_integration/rails/actionpack31/helpers.rb diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb new file mode 100644 index 00000000..3fcb825f --- /dev/null +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -0,0 +1,5 @@ +module Sass::Script::Functions + def generated_image_url(path) + asset_url(path, "image") + end +end diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index 03542ad0..e4df7c49 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -145,7 +145,7 @@ module Compass::SassExtensions::Functions::Sprites Sass::Script::Functions.declare :sprite_position, [:map, :sprite, :offset_x, :offset_y] def sprite_image(*args) - raise Sass::SyntaxError, %Q(The sprite-image() function has been replaced by sprite(). See http://beta.compass-style.org/help/tutorials/spriting/ for more information.) + raise Sass::SyntaxError, %Q(The sprite-image() function has been replaced by sprite(). See http://compass-style.org/help/tutorials/spriting/ for more information.) end protected From 02f268f1b19ce77b93d117072884856392108035 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 10:47:09 -0700 Subject: [PATCH 067/290] Properly detect minimum rails31 version. --- lib/compass/app_integration/rails.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb index 1671f7f4..aaae4d42 100644 --- a/lib/compass/app_integration/rails.rb +++ b/lib/compass/app_integration/rails.rb @@ -26,7 +26,7 @@ module Compass def configuration config = Compass::Configuration::Data.new('rails') config.extend(ConfigurationDefaults) - config.extend(ConfigurationDefaultsWithAssetPipeline) if Sass::Util.ap_geq?('3.1.0.beta') + config.extend(ConfigurationDefaultsWithAssetPipeline) if Sass::Util.ap_geq?('3.1.0') || Sass::Util.ap_geq?('3.1.0.rc') || Sass::Util.ap_geq?('3.1.0.beta') config end From d0bbb66e73dd222824c23c2cc55735af4031fddc Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 12:54:52 -0700 Subject: [PATCH 068/290] Add a generated-image-url helper for rails31 specifically --- lib/compass/app_integration/rails/actionpack31.rb | 2 +- lib/compass/app_integration/rails/actionpack31/helpers.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack31.rb b/lib/compass/app_integration/rails/actionpack31.rb index bbd2d531..5b894735 100644 --- a/lib/compass/app_integration/rails/actionpack31.rb +++ b/lib/compass/app_integration/rails/actionpack31.rb @@ -1,5 +1,5 @@ # TODO figure something out so image_path works with rails integration -%w(railtie).each do |lib| +%w(railtie helpers).each do |lib| require "compass/app_integration/rails/actionpack31/#{lib}" end diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index 3fcb825f..633620a3 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -1,5 +1,5 @@ module Sass::Script::Functions - def generated_image_url(path) - asset_url(path, "image") + def generated_image_url(path, only_path = nil) + asset_url(path, Sass::Script::String.new("image")) end end From 5896711c8a1752b889dbecc2edd29fae036bda36 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 12:55:51 -0700 Subject: [PATCH 069/290] Set a default value for the default_http_generated_images_path in rails 3.1 --- lib/compass/app_integration/rails/configuration_defaults.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb index d8183f1c..146ad8cf 100644 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ b/lib/compass/app_integration/rails/configuration_defaults.rb @@ -30,6 +30,10 @@ module Compass "#{top_level.http_path}" end + def default_http_generated_images_path + "#{top_level.http_path}" + end + def default_http_javascripts_path "#{top_level.http_path}" end From e2960d81b01b01f50f6440268f780d9a19276a1d Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 12:58:08 -0700 Subject: [PATCH 070/290] Move callbacks to the configuration base class and make them work correctly with inherited data. --- lib/compass/compiler.rb | 4 +-- lib/compass/configuration/data.rb | 36 +++++++++++++------ lib/compass/configuration/file_data.rb | 22 ------------ lib/compass/configuration/helpers.rb | 4 +-- lib/compass/configuration/inheritance.rb | 13 +++++++ .../sass_extensions/sprites/sprite_methods.rb | 4 +-- 6 files changed, 45 insertions(+), 38 deletions(-) diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index f5dcbe12..11759e26 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -138,7 +138,7 @@ module Compass end duration = options[:time] ? "(#{(css_content.__duration * 1000).round / 1000.0}s)" : "" write_file(css_filename, css_content, options.merge(:force => true, :extra => duration)) - Compass.configuration.run_callback(:stylesheet_saved, css_filename) + Compass.configuration.run_stylesheet_saved(css_filename) end def should_compile?(sass_filename, css_filename) @@ -159,7 +159,7 @@ module Compass formatted_error = "(Line #{e.sass_line}: #{e.message})" file = basename(sass_filename) logger.record :error, file, formatted_error - Compass.configuration.run_callback(:stylesheet_error, sass_filename, formatted_error) + Compass.configuration.run_stylesheet_error(sass_filename, formatted_error) write_file css_filename, error_contents(e, sass_filename), options.merge(:force => true) end diff --git a/lib/compass/configuration/data.rb b/lib/compass/configuration/data.rb index ddc2de3a..2bd3b997 100644 --- a/lib/compass/configuration/data.rb +++ b/lib/compass/configuration/data.rb @@ -18,12 +18,38 @@ module Compass class Data attr_reader :name + extend Sass::Callbacks + include Compass::Configuration::Inheritance include Compass::Configuration::Serialization include Compass::Configuration::Adapters extend Compass::Configuration::Paths + # on_sprite_saved + # yields the filename + # usage: on_sprite_saved {|filename| do_something(filename) } + define_callback :sprite_saved + chained_method :run_sprite_saved + + # on_sprite_generated + # yields 'ChunkyPNG::Image' + # usage: on_sprite_generated {|sprite_data| do_something(sprite_data) } + define_callback :sprite_generated + chained_method :run_sprite_generated + + # on_stylesheet_saved + # yields the filename + # usage: on_stylesheet_saved {|filename| do_something(filename) } + define_callback :stylesheet_saved + chained_method :run_stylesheet_saved + + # on_stylesheet_error + # yields the filename & message + # usage: on_stylesheet_error {|filename, message| do_something(filename, message) } + define_callback :stylesheet_error + chained_method :run_stylesheet_error + inherited_accessor *ATTRIBUTES inherited_accessor :required_libraries, :loaded_frameworks, :framework_path #XXX we should make these arrays add up cumulatively. @@ -138,16 +164,6 @@ module Compass relative_assets || http_images_path == :relative end - def run_callback(event, *args) - begin - send(:"run_#{event}", *args) - rescue NoMethodError => e - unless e.message =~ /run_#{event}/ - raise - end - end - end - private def assert_valid_keys!(attr_hash) diff --git a/lib/compass/configuration/file_data.rb b/lib/compass/configuration/file_data.rb index af628752..49c432d6 100644 --- a/lib/compass/configuration/file_data.rb +++ b/lib/compass/configuration/file_data.rb @@ -1,28 +1,6 @@ module Compass module Configuration class FileData < Data - extend Sass::Callbacks - - # on_sprite_generated - # yields the filename - # usage: on_sprite_save {|filename| do_somethign(filename) } - define_callback :sprite_saved - - # on_sprite_generated - # yields 'ChunkyPNG::Image' - # usage: on_sprite_generated {|sprite_data| do_something(sprite_data) } - define_callback :sprite_generated - - # on_stylesheet_saved - # yields the filename - # usage: on_stylesheet_saved {|filename| do_something(filename) } - define_callback :stylesheet_saved - - # on_stylesheet_error - # yields the filename & message - # usage: on_stylesheet_error {|filename, message| do_something(filename, message) } - define_callback :stylesheet_error - def self.new_from_file(config_file, defaults = nil) data = new(config_file) data.with_defaults(defaults) do diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index 9017f735..8164ff2b 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -68,10 +68,10 @@ module Compass end unless @callbacks_loaded Sass::Plugin.on_updating_stylesheet do |sass_file, css_file| - Compass.configuration.run_callback(:stylesheet_saved, css_file) + Compass.configuration.run_stylesheet_saved(css_file) end Sass::Plugin.on_compilation_error do |e, filename, css| - Compass.configuration.run_callback(:stylesheet_error, filename, e.message) + Compass.configuration.run_stylesheet_error(filename, e.message) end @callbacks_loaded = true end diff --git a/lib/compass/configuration/inheritance.rb b/lib/compass/configuration/inheritance.rb index da12b5bc..d7224ac5 100644 --- a/lib/compass/configuration/inheritance.rb +++ b/lib/compass/configuration/inheritance.rb @@ -61,6 +61,19 @@ module Compass inherited_writer(*attributes) end + def chained_method(method) + line = __LINE__ + 1 + class_eval %Q{ + alias_method :_chained_#{method}, method + def #{method}(*args, &block) + _chained_#{method}(*args, &block) + if inherited_data + inherited_data.#{method}(*args, &block) + end + end + }, __FILE__, line + end + end diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 36cf76ed..d07b3d05 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -53,7 +53,7 @@ module Compass cleanup_old_sprites end engine.construct_sprite - Compass.configuration.run_callback(:sprite_generated, engine.canvas) + Compass.configuration.run_sprite_generated(engine.canvas) save! end end @@ -89,7 +89,7 @@ module Compass def save! FileUtils.mkdir_p(File.dirname(filename)) saved = engine.save(filename) - Compass.configuration.run_callback(:sprite_saved, filename) + Compass.configuration.run_sprite_saved(filename) saved end From 7147147e24121ffb03044c638a6a8b02b8fccb7f Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 28 Aug 2011 13:00:19 -0700 Subject: [PATCH 071/290] Make sprites work with the asset pipeline. --- .../rails/actionpack31/railtie.rb | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb index 6604e836..b26ef6e7 100644 --- a/lib/compass/app_integration/rails/actionpack31/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack31/railtie.rb @@ -31,6 +31,45 @@ class Rails::Railtie::Configuration end data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded. Compass.add_project_configuration(data) + Compass.configuration.on_sprite_saved do |filename| + # This is a huge hack based on reading through the sprockets internals. + # Sprockets needs an API for adding assets during precompilation. + # At a minimum sprockets should provide this API: + # + # #filename is a path in the asset source directory + # Rails.application.assets.new_asset!(filename) + # + # # logical_path is how devs refer to it, data is the contents of it. + # Rails.application.assets.new_asset!(logical_path, data) + # + # I would also like to select one of the above calls based on whether + # the user is precompiling or not: + # + # Rails.application.assets.precompiling? #=> true or false + # + # But even the above is not an ideal API. The issue is that compass sprites need to + # avoid generation if the sprite file is already generated (which can be quite time + # consuming). To do this, compass has it's own uniqueness hash based on the user's + # inputs instead of being based on the file contents. So if we could provide our own + # hash or some metadata that is opaque to sprockets that could be read from the + # asset's attributes, we could avoid cluttering the assets directory with generated + # sprites and always just use the logical_path + data version of the api. + if Rails.application.config.action_controller.perform_caching + asset = Rails.application.assets.find_asset(filename) + pathname = Pathname.new(filename) + logical_path = filename[(Compass.configuration.generated_images_path.length+1)..-1] + # Force the asset into the cache so find_asset will find it. + cached_assets = Rails.application.assets.instance_variable_get("@assets") + cached_assets[logical_path] = cached_assets[filename] = asset + if File.directory?(Rails.application.assets.static_root) + # Copy the asset into the static root so the browsers will find it. + asset_attributes = Rails.application.assets.attributes_for(logical_path) + digest_path = asset_attributes.path_with_fingerprint(asset.digest) + static_path = Rails.application.assets.static_root.join(digest_path) + asset.write_to(static_path) + end + end + end data end @compass From 89c44698ac4a0a44326ce35f6867c333514b5359 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 30 Aug 2011 00:05:13 -0700 Subject: [PATCH 072/290] update changelog --- doc-src/content/CHANGELOG.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 0370eca9..9e8544be 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,8 +14,9 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.0 (UNRELEASED) -------------------- +0.12.0.alpha.0 (8/30/2011) +-------------------------- +* Support for the rails 3.1 asset pipeline * Added support for diagonal, horizontal, and smart sprite layout * Fixed a bug with spacing in horizontal layout * Changed the descriptions of the sin, cos, and tan to be more descriptive From 2fea4c105d1df4ec97cfea8f22e2b2b49ff57e51 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 30 Aug 2011 00:17:49 -0700 Subject: [PATCH 073/290] Fix stupid 0 in version --- VERSION.yml | 3 +-- doc-src/content/CHANGELOG.markdown | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/VERSION.yml b/VERSION.yml index f8ec44cf..77c922d5 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -1,7 +1,6 @@ --- :major: 0 :minor: 12 -:patch: 0 :state: alpha :build: 0 -:name: Alnilam \ No newline at end of file +:name: Alnilam diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 9e8544be..3e17271e 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,7 +14,7 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.0.alpha.0 (8/30/2011) +0.12.alpha.0 (8/30/2011) -------------------------- * Support for the rails 3.1 asset pipeline * Added support for diagonal, horizontal, and smart sprite layout From fe7bbdd84be21e984405cf8b370f23380743d7ac Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 30 Aug 2011 11:12:29 -0300 Subject: [PATCH 074/290] fixed a typo --- doc-src/content/CHANGELOG.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 3e17271e..a87cb7b3 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -22,7 +22,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Changed the descriptions of the sin, cos, and tan to be more descriptive * Fixed trig functions via issue #498 * Fixed the default `http_path` in rails -* Sprites can now have a `sprite_seach_path` that is an array of directories that +* Sprites can now have a `sprite_search_path` that is an array of directories that contain source images for sprites handy for using sprites in extensions of gems * Added a new set of configuration properties for generated images. `generated_images_dir`, `generated_images_path`, `http_generated_images_dir`, From 7733f21dd0cf473d3d641c7af44c70d5e37561cf Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 30 Aug 2011 11:13:25 -0300 Subject: [PATCH 075/290] another typo --- doc-src/content/CHANGELOG.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index a87cb7b3..b98f52ff 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -23,7 +23,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Fixed trig functions via issue #498 * Fixed the default `http_path` in rails * Sprites can now have a `sprite_search_path` that is an array of directories that - contain source images for sprites handy for using sprites in extensions of gems + contain source images for sprites handy for using sprites in extensions or gems * Added a new set of configuration properties for generated images. `generated_images_dir`, `generated_images_path`, `http_generated_images_dir`, and `http_generated_images_path` can now be set to control where generated From 375c08b60e5dd8a263eb4a529ec6ca84980df767 Mon Sep 17 00:00:00 2001 From: Lloyd Kupchanko Date: Tue, 30 Aug 2011 21:39:02 -0600 Subject: [PATCH 076/290] Fix for issue #522 --- lib/compass/configuration/helpers.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index 8164ff2b..b0bf7d45 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -78,6 +78,7 @@ module Compass end def configure_rails!(app) + return unless app.config.respond_to?(:sass) app.config.compass.to_sass_engine_options.each do |key, value| app.config.sass.send(:"#{key}=", value) end From c7c007672f34945ea8bc275975e08520ee1925ab Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 3 Sep 2011 00:38:11 -0400 Subject: [PATCH 077/290] refactored docs to use latest nanoc and extracted styles to compass-theme gem --- doc-src/.compass/config.rb | 2 +- doc-src/Gemfile | 12 +- doc-src/Gemfile.lock | 60 ++-- .../stylesheets/core/_base-classes.sass | 70 ----- .../stylesheets/core/_clearing-classes.sass | 17 -- .../content/stylesheets/core/_extensions.scss | 10 - .../content/stylesheets/partials/_blog.scss | 6 - .../content/stylesheets/partials/_code.scss | 113 ------- .../stylesheets/partials/_example.scss | 29 -- .../content/stylesheets/partials/_home.scss | 99 ------- .../stylesheets/partials/_install.scss | 10 - .../content/stylesheets/partials/_layout.scss | 21 -- .../content/stylesheets/partials/_main.scss | 63 ---- .../content/stylesheets/partials/_nav.scss | 96 ------ .../stylesheets/partials/_sidebar.scss | 31 -- .../content/stylesheets/partials/_theme.scss | 275 ------------------ .../stylesheets/partials/_typography.scss | 47 --- .../content/stylesheets/syntax/_shCore.scss | 216 -------------- .../stylesheets/syntax/_shThemeRDark.scss | 113 ------- .../stylesheets/syntax/_syntax-theme.scss | 8 - .../stylesheets/syntax/_theme_template.scss | 120 -------- doc-src/layouts/partials/example.haml | 2 +- doc-src/layouts/reference.haml | 2 +- 23 files changed, 40 insertions(+), 1382 deletions(-) delete mode 100644 doc-src/content/stylesheets/core/_base-classes.sass delete mode 100644 doc-src/content/stylesheets/core/_clearing-classes.sass delete mode 100644 doc-src/content/stylesheets/core/_extensions.scss delete mode 100644 doc-src/content/stylesheets/partials/_blog.scss delete mode 100644 doc-src/content/stylesheets/partials/_code.scss delete mode 100644 doc-src/content/stylesheets/partials/_example.scss delete mode 100644 doc-src/content/stylesheets/partials/_home.scss delete mode 100644 doc-src/content/stylesheets/partials/_install.scss delete mode 100644 doc-src/content/stylesheets/partials/_layout.scss delete mode 100644 doc-src/content/stylesheets/partials/_main.scss delete mode 100644 doc-src/content/stylesheets/partials/_nav.scss delete mode 100644 doc-src/content/stylesheets/partials/_sidebar.scss delete mode 100644 doc-src/content/stylesheets/partials/_theme.scss delete mode 100644 doc-src/content/stylesheets/partials/_typography.scss delete mode 100644 doc-src/content/stylesheets/syntax/_shCore.scss delete mode 100644 doc-src/content/stylesheets/syntax/_shThemeRDark.scss delete mode 100644 doc-src/content/stylesheets/syntax/_syntax-theme.scss delete mode 100644 doc-src/content/stylesheets/syntax/_theme_template.scss diff --git a/doc-src/.compass/config.rb b/doc-src/.compass/config.rb index 44420f21..46d1e4ac 100644 --- a/doc-src/.compass/config.rb +++ b/doc-src/.compass/config.rb @@ -1,7 +1,7 @@ # Require any additional compass plugins here. require 'susy' require 'css-slideshow' - +require 'compass-theme' # Set this to the root of your project when deployed: http_path = "/" project_path = File.expand_path(File.join(File.dirname(__FILE__), '..')) diff --git a/doc-src/Gemfile b/doc-src/Gemfile index 184436c3..ea0c8106 100644 --- a/doc-src/Gemfile +++ b/doc-src/Gemfile @@ -1,6 +1,8 @@ source :gemcutter -gem 'nanoc3', :git => "git://github.com/chriseppstein/nanoc.git" +#gem 'cri', '~> 1.0.1' +gem 'adsf' +gem 'nanoc3' #, :git => "git://github.com/chriseppstein/nanoc.git" gem 'rdiscount' gem 'thor' gem 'rack' @@ -8,12 +10,12 @@ gem 'mime-types' gem 'serve', "1.0.0" gem 'nokogiri' gem 'coderay' -gem 'sass', ">= 3.1" -gem 'haml', ">= 3.1" +gem 'haml' gem 'rake' gem 'compass', :path => ".." -gem 'compass-susy-plugin', ">=0.7.0.pre8" -gem 'css-slideshow', "0.2.0" +gem 'compass-theme', '~> 0.0.1' +# gem 'compass-susy-plugin', ">=0.7.0.pre8" +# gem 'css-slideshow', "0.2.0" gem 'json' gem 'css_parser', "1.0.1" gem 'ruby-prof' diff --git a/doc-src/Gemfile.lock b/doc-src/Gemfile.lock index 3b1322b2..bb835f00 100644 --- a/doc-src/Gemfile.lock +++ b/doc-src/Gemfile.lock @@ -1,71 +1,71 @@ -GIT - remote: git://github.com/chriseppstein/nanoc.git - revision: 4eee0e60c5121b90498caa88605d416521553378 - specs: - nanoc3 (3.2.0a3) - cri (>= 1.0.0) - PATH remote: .. specs: - compass (0.11.1.93b89a2) - chunky_png (~> 1.1) + compass (0.12.alpha.0.374aed6) + chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) GEM remote: http://rubygems.org/ specs: - activesupport (3.0.7) - builder (2.1.2) - chunky_png (1.2.0) - coderay (0.9.7) - compass-susy-plugin (0.9.beta.3) - compass (>= 0.11.beta.3) - cri (1.0.1) + activesupport (3.0.10) + adsf (1.0.1) + rack (>= 1.0.0) + builder (3.0.0) + chunky_png (1.2.1) + coderay (0.9.8) + compass-susy-plugin (0.9) + compass (>= 0.11.1) + compass-theme (0.0.1) + compass (~> 0.11) + compass-susy-plugin (>= 0.7.0.pre8) + css-slideshow (= 0.2.0) + cri (2.0.2) css-slideshow (0.2.0) compass (>= 0.10.0.rc3) css_parser (1.0.1) fssm (0.2.7) - haml (3.1.0) + haml (3.1.2) i18n (0.4.2) - json (1.5.1) + json (1.5.4) mime-types (1.16) - nokogiri (1.4.4) - rack (1.2.2) - rake (0.8.7) - rb-fsevent (0.4.0) + nanoc3 (3.2.1) + cri (~> 2.0) + nokogiri (1.5.0) + rack (1.2.3) + rake (0.9.2) + rb-fsevent (0.4.3.1) rdiscount (1.6.8) - ruby-prof (0.9.2) - sass (3.1.0) + ruby-prof (0.10.8) + sass (3.1.7) serve (1.0.0) activesupport (~> 3.0.1) i18n (~> 0.4.1) rack (~> 1.2.1) tzinfo (~> 0.3.23) thor (0.14.6) - tzinfo (0.3.26) + tzinfo (0.3.29) PLATFORMS ruby DEPENDENCIES + adsf builder coderay compass! - compass-susy-plugin (>= 0.7.0.pre8) - css-slideshow (= 0.2.0) + compass-theme (~> 0.0.1) css_parser (= 1.0.1) - haml (>= 3.1) + haml json mime-types - nanoc3! + nanoc3 nokogiri rack rake rb-fsevent rdiscount ruby-prof - sass (>= 3.1) serve (= 1.0.0) thor diff --git a/doc-src/content/stylesheets/core/_base-classes.sass b/doc-src/content/stylesheets/core/_base-classes.sass deleted file mode 100644 index c7cc0b66..00000000 --- a/doc-src/content/stylesheets/core/_base-classes.sass +++ /dev/null @@ -1,70 +0,0 @@ -$default-rounded-corner: 4 - -.group - +pie-clearfix - -.truncate - +ellipsis - -.border-box - +box-sizing(border-box) - -.round-corners-4 - +border-radius(4px) - -.round-corners-em - +border-radius(1em) - -=round-corners($num: $default-rounded-corner) - @extend .round-corners-#{$num} - -=round-top-corners($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-bottom-right-corner - @extend .clear-bottom-left-corner -=round-bottom-corners($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner - @extend .clear-top-left-corner -=round-left-corners($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner - @extend .clear-bottom-right-corner -=round-right-corners($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-left-corner - @extend .clear-bottom-left-corner - -=round-top-left-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner - @extend .clear-bottom-right-corner - @extend .clear-bottom-left-corner -=round-top-right-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-left-corner - @extend .clear-bottom-right-corner - @extend .clear-bottom-left-corner -=round-bottom-left-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner - @extend .clear-bottom-right-corner - @extend .clear-top-left-corner -=round-bottom-right-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner - @extend .clear-top-left-corner - @extend .clear-bottom-left-corner - -=square-top-left-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-left-corner -=square-top-right-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-top-right-corner -=square-bottom-left-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-bottom-left-corner -=square-bottom-right-corner($num: $default-rounded-corner) - +round-corners($num) - @extend .clear-bottom-right-corner \ No newline at end of file diff --git a/doc-src/content/stylesheets/core/_clearing-classes.sass b/doc-src/content/stylesheets/core/_clearing-classes.sass deleted file mode 100644 index 9a60d248..00000000 --- a/doc-src/content/stylesheets/core/_clearing-classes.sass +++ /dev/null @@ -1,17 +0,0 @@ -.clear-top-left-corner - +border-top-left-radius(0) -.clear-top-right-corner - +border-top-right-radius(0) -.clear-bottom-left-corner - +border-bottom-left-radius(0) -.clear-bottom-right-corner - +border-bottom-right-radius(0) - -.hide - display: none -.clear-box-shadow - +box-shadow(none) -.clear-border-radius - @extend .clear-rounded-corners -.clear-rounded-corners - +border-radius(0) diff --git a/doc-src/content/stylesheets/core/_extensions.scss b/doc-src/content/stylesheets/core/_extensions.scss deleted file mode 100644 index cd2fd5c4..00000000 --- a/doc-src/content/stylesheets/core/_extensions.scss +++ /dev/null @@ -1,10 +0,0 @@ -@mixin reset($reset-type: false){ - @if($reset-type){ - @if($reset-type == global){ - @include global-reset; - } - @if($reset-type == html5){ - @include reset-html5; - } - } -} diff --git a/doc-src/content/stylesheets/partials/_blog.scss b/doc-src/content/stylesheets/partials/_blog.scss deleted file mode 100644 index ac79d58d..00000000 --- a/doc-src/content/stylesheets/partials/_blog.scss +++ /dev/null @@ -1,6 +0,0 @@ -body#blog-archive { - .timestamp { - margin-right: 1em; - font-size: 12px; - } -} \ No newline at end of file diff --git a/doc-src/content/stylesheets/partials/_code.scss b/doc-src/content/stylesheets/partials/_code.scss deleted file mode 100644 index 710b75f3..00000000 --- a/doc-src/content/stylesheets/partials/_code.scss +++ /dev/null @@ -1,113 +0,0 @@ -//html.sass .mixin-source .scss, html.scss .mixin-source .sass { @extend .hide;} -.mixin-source, .example-source, .function-source { - position: relative; @extend .fixed-font; - .syntaxhighlighter, pre { - &.scss, &.sass, &.css, &.haml, &.html { display: none; } } } - -html.sass { .mixin-source, .example-source, .function-source { .syntaxhighlighter.sass { display: block; } } } -html.scss { .mixin-source, .example-source, .function-source { .syntaxhighlighter.scss { display: block; } } } -html.css .example-source .syntaxhighlighter.css { display: block; } -html.html .example-source .syntaxhighlighter.html { display: block; } -html.haml .example-source .syntaxhighlighter.haml { display: block; } - - - -.mixin-source, .function-source { display: none; } - -html.light .syntaxhighlighter, html.dark .syntaxhighlighter { - margin: 0 0 2px; - code { padding: 0; } - //font-size: 1.1em; - text-shadow: none; - .code-block { background: none; @extend .clear-box-shadow; } - table td.gutter { .line { &:first-child { padding-top: 10px !important; } &:last-child { padding-bottom: 10px !important; } } } - .toolbar { display: none; } - //a.help { font-size: 1.5em; @extend .pictos; color: #aaa; position: relative; right: 6px; top: 2px; } - } - -a[rel="github-source"] { - position: relative; - float: right; - top: 1.1em; -} - -pre { - margin: 1.5em 0; - overflow: auto; - .code-block:first-child { padding: .6em; display: block; } - .code-block:first-child { width: 100%; @include box-sizing(border-box); overflow: auto; } -} - -.code-block { @extend .round-corners-4; @extend .fixed-font; - display: inline-block; - font-size: .95em; - padding: 0 .4em; - line-height: 1.5em; -} - -.source-documentation { - @extend .round-corners-4; - padding: 10px 15px; - @include round-bottom-corners -} - -h3 { @include round-corners; - padding: 10px 15px; - margin: 20px 0 20px; - font-weight: bold; - position: relative; - a { text-decoration: none;} - code, .arg { font-weight: normal; } -} -h3.mixin, h3.function { @include round-top-corners; margin-bottom: 2px;} -.arg { - display: inline-block; - padding: 0 2px; - &[data-default-value] { - font-style: italic; - &:before { content: "[" ; } - &:after { content: "]" ; }} -} - -a[rel="view source"]{ float: right; padding: 9px 15px; margin-top: 20px; position: relative; z-index: 2; font-size: .8em; @include hover-link;} -h2 + a[rel="view source"]{ margin-top: 6px;} - -.syntaxhighlighter { - a, div, code, table, table td, table tr, table tbody, table thead, table caption, textarea { - background: none; border: 0; bottom: auto; float: none; height: auto; left: auto; line-height: 1.2em !important; - padding: 0; margin: 0; outline: 0; - overflow: visible; position: static; right: auto; - text-align: left; top: auto; vertical-align: baseline; - width: auto; - font: { weight: normal; style: normal; - size: 1em; - } - min: { height: inherit; } - } -} - -.syntaxhighlighter { width: 100%; margin: 1em 0 1em 0; position: relative; overflow: auto; font-size: 1em; - - // set up bold and italic - .bold { font-weight: bold; } - .italic { font-style: italic; } - .line { white-space: pre; } - - // main table and columns - table { width: 100%; - td.code { width: 100%; - .line { padding: 0 .6em; } } - td.gutter .line { text-align: right; padding: 0 0.8em 0 1em; } } // middle spacing between line numbers and lines - - // Styles for the toolbar - .toolbar { position: absolute; right: 1px; top: 1px; width: 11px; height: 11px; font-size: 10px; z-index: 10; - span.title { display: inline; } - a { display: block; text-align: center; text-decoration: none; padding-top: 1px; } } - .container { position: relative; } - textarea { @include stretch(0, .65em, 0, .65em); @extend .fixed-font; font-size: .95em; line-height: 1.3em !important;} -} -.syntaxhighlighter, pre .code-block:first-child, pre { - &::-webkit-scrollbar { height: 12px; } - &::-webkit-scrollbar-button { &:start:decrement, &:end:increment { display: block; width: 0; height: 0; } } - &::-webkit-scrollbar-thumb:horizontal { -webkit-border-radius: 5px; -webkit-background-clip: padding-box; } -} diff --git a/doc-src/content/stylesheets/partials/_example.scss b/doc-src/content/stylesheets/partials/_example.scss deleted file mode 100644 index 46c65ff0..00000000 --- a/doc-src/content/stylesheets/partials/_example.scss +++ /dev/null @@ -1,29 +0,0 @@ -html.light #demo, html.dark #demo { - color: #333; -} - -#demo { - @include round-corners; - @extend .group; - background: #fff; - margin-bottom: 1.2em; - padding: 40px; - code { - @include box-shadow(rgba(#000, .3) 0 1px 3px, rgba(#000, .15) 0 1px 0 0 inset); - background: #fff; - color: inherit; - } -} - -#how { - section { width: 49%; float: left; } - section + section { float: right; } - - .example-source { clear: both; } -} - -#reference { - float: right; - margin-top: 1em; -} - diff --git a/doc-src/content/stylesheets/partials/_home.scss b/doc-src/content/stylesheets/partials/_home.scss deleted file mode 100644 index e322c02e..00000000 --- a/doc-src/content/stylesheets/partials/_home.scss +++ /dev/null @@ -1,99 +0,0 @@ -body#home { - width: 810px; - #page { padding-top: 31px;} - h1#logo { - $logo: 'compass-logo.png'; - background: image-url($logo) no-repeat; - text-indent: -9999px; - overflow: hidden; - width: image-width($logo); - height: image-height($logo)/2; - padding: 0; - margin: 0 auto 18px; - } - #{headings()}{ @extend .heading-font; } - h2 { - text-align: center; - font-size: 30px; - padding-bottom: 15px; - margin-bottom: 30px; - line-height: 1.1em; - } - h3 { - text-align: center; - font-size: 25px; - margin-top: 32px; - } - h4 { font-size: 1.5em; } - .overview { - @extend .group; - .compass { width: 406px; float: left; - h4:before { content: "k"; } } - .sass { width: 275px; float: right; - h4:before { content: "2"; } } - div { - padding: 20px; - h4 { - padding-bottom: 12px; - margin-bottom: 12px; - &:before { - @extend .pictos; - color: #fb292d; - display: inline-block; - font-size: 1.2em; - padding-right: .3em; - } - } - } - ol { padding-left: 0; list-style: inside decimal; margin-bottom: 0; } - p { margin-bottom: 0; } - ol, p { line-height: 1.8em; font-size: .95em;} - } -} -ul#featured_sites { - @extend .group; - overflow: visible; - margin-top: 30px; - list-style: none; - padding: 0px; - li { - float: left; - text-shadow: none; - overflow: visible; - position: relative; - &:nth-child(3n+2){ margin: 0 7px; } - &:nth-child(1n+4){ margin-top: 7px; } - &:nth-child(3n+4){ clear: left; } - padding: 6px; - a { text-decoration: none; } - img { float: left; width: 240px; } - span { display: none;} - &:hover { z-index: 100; - padding: 3px 2px; - img { width: 248px; } - span { display: block; position: absolute; text-shadow: none;} - } - .url { - bottom: 2px; left: 2px; right: 2px; background: #000; background: rgba(#000, .8); z-index: 102; padding: 2.2em 10px 6px; - font-size: .8em; border-top: 1px solid rgba(#fff, .2); } - .title { bottom: 1.7em; left: 0; z-index: 103; text-decoration: none; padding: 0 11px; color: #fff; } - } -} -section.book, section.gui { - width: 48%; - float: left; - @extend .group; - h3 { margin-bottom: 1em; height: 2em; text-align: left; } -} -section.book { - margin-right: 2%; - img { float: left; margin-right: 1em; margin-bottom: 1em; } -} -section.gui { - text-align: center; - .note { - font-size: smaller; - } -} - -html.light body#home { h1#logo { background-position: bottom;} } \ No newline at end of file diff --git a/doc-src/content/stylesheets/partials/_install.scss b/doc-src/content/stylesheets/partials/_install.scss deleted file mode 100644 index 353a2df8..00000000 --- a/doc-src/content/stylesheets/partials/_install.scss +++ /dev/null @@ -1,10 +0,0 @@ -body#install { - #steps, p.madlib, p.note, h4 { margin-top: 1em; } - p.note { font-size: smaller; font-style: italic; } - p.warning { color: #c00; } - .customization { display: none; } - .customizable .customization { display: inline; } - blockquote { border-left: 2px solid #ccc; - text-indent: 0; padding-left: 0.5em; } - .customization input { width: 8em; } -} \ No newline at end of file diff --git a/doc-src/content/stylesheets/partials/_layout.scss b/doc-src/content/stylesheets/partials/_layout.scss deleted file mode 100644 index 5148ac89..00000000 --- a/doc-src/content/stylesheets/partials/_layout.scss +++ /dev/null @@ -1,21 +0,0 @@ -$min-width: 700px; -$side-nav-width: 160px; -$main-min-width: $min-width - $side-nav-width; - -body { - max-width: 1500px; - min-width: $min-width; - margin: 0 auto; - @extend .sans-font; - line-height: 1.45em; -} - -#wrap { @extend .group; padding: 0 20px 20px; } -#page { @extend .group; padding-bottom: 30px; } -footer { @extend .group; clear: both; padding-top: 20px;} -header { padding: 22px 0 0; position: relative; } -#page aside + article { margin-left: $side-nav-width + 22px; padding-left: 23px; } -aside { float: left; width: $side-nav-width; position: relative; z-index: 2;} - -body#home #page article { padding-left: 0;} -body.site, body#changelog, body.default { max-width: 1024px; } diff --git a/doc-src/content/stylesheets/partials/_main.scss b/doc-src/content/stylesheets/partials/_main.scss deleted file mode 100644 index 2fb7694b..00000000 --- a/doc-src/content/stylesheets/partials/_main.scss +++ /dev/null @@ -1,63 +0,0 @@ -body.get-involved h1 + p { font-size: 1.2em; line-height: 1.45em; } - -#page { - position: relative; - padding-top: 40px; - & > article { padding-top: 10px; font-size: 15px; - img { max-width: 100%; } } } - -#theme_pref { - a { display: block; font-size: 18px; width: .9em; position: relative; text-decoration: none; @extend .pictos; } } - -#docs_panel { - position: absolute; top: 0; right: 0; - width: 100%; - & > div { float: right; margin-left: 10px; @include round-bottom-corners; border: 1px solid; border-top: 0;} - a { text-decoration: none; } - #theme_pref { padding: 3px 12px 6px; a { position: relative; top: 2px;} } - #version { font-size: .75em; padding: 4px 0 5px; background: none; border: none; position: absolute; left: 0; a { @include hover-link; } } - -} - -#syntax_pref, .syntax_pref { padding: 4px 8px 5px; a { font-size: .9em; padding: 0px 6px 1px; display: inline-block; line-height: 1.45em;} } - -.syntax_pref { - float: left; @include round-top-corners; border: 1px solid; border-bottom: 0; - a { text-decoration: none; } -} - -footer { - .links { float: left; font-size: .9em; - img { vertical-align: middle; padding-right: 5px; position: relative; top: -2px;} - span { position: relative; top: -1px; } - ul { @include horizontal-list(15px); overflow: visible; - li { padding-top: 3px; } - li:last-child {border: 0; @include box-shadow(none); } } } -} -#page article h2 { - margin-top: 1.5em; -} -h2 a.help { - text-indent: -9999px; - display: inline-block; - position: relative; - text-decoration: none; - @include opacity(.3); - &:hover { @include opacity(.7); } - &:before { - @extend .pictos; - content: "?"; - text-indent: 0; - position: absolute; - top: 2px; - left: 0; - font-size: .85em; - } -} -hr { - height: 0px; - border: 0; - border-bottom-width: 4px; - margin: 3em 0; - background: transparent; -} diff --git a/doc-src/content/stylesheets/partials/_nav.scss b/doc-src/content/stylesheets/partials/_nav.scss deleted file mode 100644 index c1122aad..00000000 --- a/doc-src/content/stylesheets/partials/_nav.scss +++ /dev/null @@ -1,96 +0,0 @@ -.triangle-marker { - border-color: transparent transparent; - content: "\00a0"; - height: 0; width: 0; - position: absolute; - border-style: solid; } - -nav a { @include hover-link; } -nav .selected a:hover { text-decoration: none;} - -header { @extend .group; - font-size: 1.3em; @extend .heading-font; border-width: 4px;} -#main-nav { - display: inline-block; - padding-bottom: 10px; - ul { - @include horizontal-list(10px); - line-height: 2em; }} - -#sub-nav { - @extend .group; - padding: 8px 0; } - -#docs-nav, #module-nav { - display: inline-block; - float: left; - a { - padding: 2px 10px; - display: inline-block; }} - -#docs-nav { padding-right: 30px; - & + #module-nav { - padding-left: 20px; - }} - -#module-nav { - display: inline-block; - ul { @include horizontal-list(false); }} - -body.getting-started #module-nav li.getting-started, -body.tutorial #module-nav li.tutorials, -body.support #module-nav li.support, -#module-nav li.selected { - position: relative; - a { - text-decoration: none; - } - a:before{ @extend .triangle-marker; - border-width: 0 8px 8px; - z-index: 2; - bottom: -9px; - left: 50%; - margin-left: -8px; - border-bottom-color: #121212; - } - &:before { @extend .triangle-marker; - border-bottom-color: #414141; - border-width: 0 6px 6px; - z-index: 3; - bottom: -9px; - left: 50%; - margin-left: -6px; - } - &:after { @extend .triangle-marker; - border-bottom-color: #343434; - border-width: 0 5px 5px; - z-index: 3; - bottom: -10px; - left: 50%; - margin-left: -5px; - } -} - -#search-docs { - width: 170px; - float: right; - position: relative; - top: .3em; - //position: absolute; top: 29px; right: 0; - &:before { - content: "s"; - display: block; - @extend .pictos; - position: absolute; - left: 6px; - top: 4px; - font-size: .8em; - z-index: 20; - @include opacity(.8) - } - input { @extend .sans-font; @include round-corners; - @include box-sizing(border-box); - width: 170px; border: 0; margin: 0; padding: 5px 8px 5px 26px; - font-size: .8em; - float: right; - position: relative; } } diff --git a/doc-src/content/stylesheets/partials/_sidebar.scss b/doc-src/content/stylesheets/partials/_sidebar.scss deleted file mode 100644 index 9894ed92..00000000 --- a/doc-src/content/stylesheets/partials/_sidebar.scss +++ /dev/null @@ -1,31 +0,0 @@ -aside { - padding-top: 15px; - text-align: right; - padding-right: 22px; - h2, h3 { - text-align: left; - font-size: 1.3em; - line-height: 1.45em; - padding-bottom: .2em; - margin-bottom: .4em; - @extend .clear-border-radius; - } - h3 { - padding: 0 0 .5em; line-height: 1.1em; - } - a { - font-size: .85em; - } - ul ul a { - &.selected, &.selected:hover { - font-weight: bold; - text-decoration: underline; - } - } - .deprecated { - text-decoration: line-through; - } - .beta span:after { - content: " (\3B2)"; - } -} diff --git a/doc-src/content/stylesheets/partials/_theme.scss b/doc-src/content/stylesheets/partials/_theme.scss deleted file mode 100644 index e60b6270..00000000 --- a/doc-src/content/stylesheets/partials/_theme.scss +++ /dev/null @@ -1,275 +0,0 @@ -@mixin site-theme($theme, $page-bg, $text, $strong-text, $heading, $link, $code, $search, $nav-link, $main-nav, $main-nav-selected, $option-panel-border, $option-panel-bg){ - background: $page-bg; - body { background: $page-bg; color: $text; - a { color: $link; } } - - #page { @extend .horizontal-rule-#{$theme}; } - header { @extend .horizontal-rule-#{$theme}; border-width: 4px; } - - nav a { color: $nav-link; } - #main-nav a { color: $main-nav;} - - body#home #main-nav a[rel=home], - body#help #main-nav a[rel=help], - body.tutorial #main-nav a[rel=help], - body.reference #main-nav a[rel=documentation], - body#changelog #main-nav a[rel=documentation], - body.demo #main-nav a[rel=documentation], - body#get-involved #main-nav a[rel=get-involved]{ color: $main-nav-selected; } - - #search-docs input { - @extend .inset-panel-#{$theme}; color: $search; - &::-webkit-input-placeholder { color: $search; } } - #{headings()}{ color: $heading; - strong { color: $main-nav-selected; } - em { color: $code; } } - - #page > article h2 { @extend .horizontal-rule-top-#{$theme}; } - hr { @extend .horizontal-rule-#{$theme}; - border-bottom-width: 8px} - body#home h2 { @extend .horizontal-rule-#{$theme}; } - - #page aside + article { @extend .vertical-rule-left-#{$theme}; } - - aside { - h2 a { color: $strong-text; } - h2, h3 { @extend .horizontal-rule-#{$theme}; }} - - footer .links li { @extend .vertical-rule-#{$theme}; } - code { @extend .code-block-#{$theme}; color: $code; } - - #theme_pref { @extend .theme-switch-#{$theme}; } - #docs_panel div, .syntax_pref { background: $option-panel-bg; border-color: $option-panel-border; } - - body#home .overview div { @extend .inset-panel-#{$theme}; - h4 { @extend .horizontal-rule-#{$theme}; } } - #featured_sites li { @extend .inset-panel-#{$theme}; } - -} -@mixin docs-theme($theme, $heading, $code, $nav-link, $docs-nav-selected, $module-nav-selected){ - - #page > article { - h1 { @extend .horizontal-rule-#{$theme}; } - h2 { @extend .horizontal-rule-top-#{$theme}; } - h3 { @extend .heading-panel-#{$theme}; } - h1 + h2, hr + h2 { - @extend .clear-box-shadow; border-top: 0; - margin-top: 0;} - } - - #sub-nav { @extend .horizontal-rule-#{$theme}; } - #docs-nav { @extend .vertical-rule-#{$theme}; } - body.core a[rel=core], body.blueprint a[rel=blueprint]{ @extend .inset-panel-#{$theme}; color: $docs-nav-selected; @extend .round-corners-4;} - #main-nav a[rel=home] { @include replace-text-with-dimensions("compass-logo-small-#{$theme}.png"); display: inline-block; float: left; } - - #module-nav { - ul { overflow: visible; }} - body.getting-started #module-nav li.getting-started, - body.tutorial #module-nav li.tutorials, - body.support #module-nav li.support, - #module-nav li.selected { @extend .selected-marker-#{$theme}; - a { color: $module-nav-selected; } } - - a[rel=sass], a[rel=scss], a[rel=css], a[rel=html], a[rel=haml] { @extend .syntax-switch-#{$theme}; } - &.sass a[rel=sass], &.scss a[rel=scss], &.css a[rel=css], &.html a[rel=html], &.haml a[rel=haml] { color: $heading; color: rgba($heading, .7); @extend .round-corners-em; @extend .inset-panel-#{$theme}; } - - #version { color: rgba($heading, .3); a { color: rgba($nav-link, .7); } } - .mixin-source, .example-source, .function-source { @extend .mixin-panel-#{$theme}; - .container textarea { color: $code; } - } - h2 a.help { color: $heading;} - - .source-documentation { @extend .doc-panel-#{$theme}; } - - #demo { @extend .demo-#{$theme}; } - - .arg { color: $code; } - .arg[data-default-value] { color: rgba($code, .7); } - a[rel="view source"]{ color: rgba($heading, .5); &:hover{ color: rgba($heading, .8);} } - -} - -// Dark theme -.inset-panel-dark { - @include box-shadow(rgba(#fff, .1) 0 1px 0, rgba(#000, .8) 0 1px 7px 0px inset); - background: darken(#2f2f2f, 6); background-color: rgba(#000, .3); } - -.horizontal-rule-dark { - @include box-shadow(rgba(#fff, .07) 0 1px 0); - border-bottom: 1px solid #121212; } - -.horizontal-rule-top-dark { - @include box-shadow(rgba(#fff, .07) 0 1px 0 inset); - border-top: 1px solid #121212; } - -.vertical-rule-dark { - @include box-shadow(rgba(#fff, .07) 1px 0 0); - border-right: 1px solid #121212; } - -.vertical-rule-left-dark { - @include box-shadow(rgba(#fff, .07) 1px 0 0 inset); - border-left: 1px solid #121212; } - -.code-block-dark { @extend .code-block; @extend .inset-panel-dark; } - -.demo-dark { - @include box-shadow(rgba(#000, .5) 0 2px 10px inset, rgba(#fff, .3) 0 1px 2px 0px, rgba(#000, .8) 0 0 0 1px inset); } - -.heading-panel-dark { - background: darken(#2f2f2f, 6); - background: rgba(#000, .2); - @include box-shadow(rgba(#000, .2) 0 0 0 1px inset); - a:hover { color: #fff; - .arg { color: rgba(#fff, .6);} - } -} -.doc-panel-dark { - background: darken(#2f2f2f, 4); - background: rgba(#000, .1); - @include box-shadow(rgba(#000, .2) 0 0 0 1px inset); -} - -.syntax-switch-dark { - color: #000; text-shadow: rgba(#fff, .08) 0 1px 0; - &:hover { color: #fff; text-shadow: #000 0 1px 0; } } - -.theme-switch-dark { - cursor: pointer; - a { color: #000; color: rgba(#000, .8); text-shadow: rgba(#fff, .08) 0 1px 0; } - &:hover a { color: #eee; text-shadow: #000 0 1px 0; } } - -.selected-marker-dark { - a:before{ border-bottom-color: #121212; } - &:before { border-bottom-color: #414141; } - &:after { border-bottom-color: #323232; } -} -.mixin-panel-dark { - @extend .inset-panel-dark; - td.gutter { background: rgba(#fff, .05); .line { border-right: 2px solid rgba(#fff, .15); color: rgba(#fff, .5); }} - .container textarea { background: darken(#2f2f2f, 6); } -} - -@mixin dark-theme($docs: false) { - $page-bg: #2f2f2f; - - $text: #c6c6c6; - $heading: white; - $strong-text: #dbdbdb; - - $search: #6e6e6e; - - $code: #dadbb1; - $nav-link: #bfbfbf; - $link: saturate(lighten(#85AFC9, 4), 19); - - $main-nav: white; - $main-nav-selected: #fb292d; - $docs-nav-selected: $strong-text; - $module-nav-selected: $link; - - $option-panel-border: rgba(#000, .5); - $option-panel-bg: rgba(#fff, .06); - - @include site-theme(dark, $page-bg, $text, $strong-text, $heading, $link, $code, $search, $nav-link, $main-nav, $main-nav-selected, $option-panel-border, $option-panel-bg); - - @if($docs){ - @include docs-theme(dark, $heading, $code, $nav-link, $docs-nav-selected, $module-nav-selected); - .syntaxhighlighter, pre, pre .code-block:first-child { - &::-webkit-scrollbar-track-piece { -webkit-box-shadow: rgba(#000, .5) 0 0 3px 1px inset; background: rgba(#000, .2); } - } - .syntaxhighlighter, pre, pre .code-block:first-child { - &::-webkit-scrollbar-thumb:horizontal { background: -webkit(linear-gradient(rgba(#fff, .3), rgba(#fff, 0))) #000; -webkit-box-shadow: rgba(black, 0.8) 0px 0 0 1px inset; } - } - } -} - -// Light Theme -.inset-panel-light { - @include box-shadow(rgba(#fff, 1) 0 1px 0, rgba(#000, .5) 0 1px 3px 0px inset); - text-shadow: 0 1px 1px #fff; - background: darken(#fff, .04); background-color: rgba(#000, .04); } - -.horizontal-rule-light { - @include box-shadow(#fff 0 1px 0); - border-bottom: 1px solid #bbb; } - -.horizontal-rule-top-light { - @include box-shadow(#fff 0 1px 0 inset); - border-top: 1px solid #bbb; } - -.vertical-rule-light { - @include single-box-shadow(rgba(#fff, 1), 1px, 0, 0); - border-right: 1px solid #bbb; } - -.vertical-rule-left-light { - @include single-box-shadow(rgba(#fff, 1), 1px, 0, 0 inset); - border-left: 1px solid #bbb; } - -.code-block-light { @extend .code-block; @extend .inset-panel-light; background: rgba(#fff, .5); } - -.demo-light { @include box-shadow(rgba(#000, .3) 0 2px 10px inset, #fff 0 1px 2px 0px, rgba(#000, .05) 0 0 0 1px inset); } - -.syntax-switch-light { - color: rgba(#000, .3); text-shadow: rgba(#fff, .08) 0 1px 0; - &:hover { color: #000; text-shadow: #fff 0 1px 0; }} - -.theme-switch-light { - cursor: pointer; - a {color: rgba(#000, .2); text-shadow: rgba(#fff, 1) 0 1px 0;} - &:hover a { color: #000; } } - -.heading-panel-light { - background: rgba(#fff, .5); - @include box-shadow(rgba(#000, .13) 0 0 0 1px inset); - a:hover { color: #000; - .arg { color: rgba(#000, .6); } } -} - -.selected-marker-light { - a:before{ border-bottom-color: #bbbbbb; } - &:before { border-bottom-color: #fff; } - &:after { border-bottom-color: #e5e5e5; } -} - -.doc-panel-light { - background: rgba(#000, .03); - text-shadow: rgba(#fff, .9) 0 1px 1px; - @include box-shadow(rgba(#000, .15) 0 0 0 1px inset); -} - -.mixin-panel-light { - @extend .inset-panel-light; - background: rgba(#fff, .8); - td.gutter { background: rgba(#000, .08); .line { border-right: 2px solid rgba(#000, .2); color: rgba(#000, .4); } } - .container textarea { background: darken(#fff, .04); } -} - -@mixin light-theme($docs: false) { - $page-bg: #ececec; // image-url('bg-light.jpg'); - - $text: #111; - $heading: #222; - $strong-text: #000; - - $search: #666; - - $link: #307eb6; - $nav-link: #444; - $code: #222; - - $main-nav: #000; - $main-nav-selected: darken(#fb292d, 15); - $docs-nav-selected: $strong-text; - $module-nav-selected: $link; - - $option-panel-border: rgba(#000, .2); - $option-panel-bg: #fff; - - @include site-theme(light, $page-bg, $text, $strong-text, $heading, $link, $code, $search, $nav-link, $main-nav, $main-nav-selected, $option-panel-border, $option-panel-bg); - - @if($docs){ - @include docs-theme(light, $heading, $code, $nav-link, $docs-nav-selected, $module-nav-selected); - .syntaxhighlighter::-webkit-scrollbar-track-piece { -webkit-box-shadow: rgba(#000, .3) 0 0 3px 1px inset; background: rgba(#ddd, .8); } - .syntaxhighlighter::-webkit-scrollbar-thumb:horizontal { background: -webkit(linear-gradient(rgba(#000, 0) 40%, rgba(#000, .2))) #fff; -webkit-box-shadow: rgba(black, 0.2) 0px 0 0 1px inset; } - } -} diff --git a/doc-src/content/stylesheets/partials/_typography.scss b/doc-src/content/stylesheets/partials/_typography.scss deleted file mode 100644 index 3e70c53a..00000000 --- a/doc-src/content/stylesheets/partials/_typography.scss +++ /dev/null @@ -1,47 +0,0 @@ -@font-face { - font-family: "pictos-web"; - src: url('/otherfonts/pictos-web.eot'); - src: local("?"), url('/otherfonts/pictos-web.woff') format('woff'), url('/otherfonts/pictos-web.ttf') format('truetype'), url('/otherfonts/pictos-web.svg#webfontIyfZbseF') format('svg');} - -@include font-face("museosans-web", font-files("museosans-web.woff", woff, "museosans-web.ttf", truetype, "museosans-web.svg#webfontJHBEijmD", svg), 'museosans-web.eot'); - - -.sans-font { font-family: 'Lucida Grande', Arial, sans-serif; } -.heading-font { font-family: 'Museo Sans', "museosans-web", 'serif'; } -.pictos { font-family: pictos, pictos-web; font-weight: normal; font-style: normal;} -.fixed-font { font-family: menlo, monaco, "andale mono", "courier new", fixed;} - -#page { - line-height: 1.45em; - ol { list-style: outside decimal; padding-left: 2.5em; } - ol ol { list-style: outside lower-alpha; padding-left: 2.5em; } - ul, ol, dl { margin-bottom: 1.5em;} - p { margin-bottom: 1.2em;} - #{headings(1,2)}{ @extend .heading-font; line-height: 1.2em; } - h1 { font-size: 35px; margin-bottom: 15px; padding-bottom: 6px; } - h2 { font-size: 26px; margin: 1em 0 15px; padding-bottom: 6px; } - h3 { font-size: 18px; } - h4 { font-size: 18px; margin: .4em 0; } - ul { list-style: inside disc; } - dt { font-weight: bold; } -} -#page aside { - ul { list-style: none; margin-bottom: 1em;} - h2 { line-height: 1.3em; margin-top: 0; padding-top: 3px;} -} -em { font-style: italic; } -strong { font-weight: bold; } - -#page > article { - ul ul { padding-left: 1em; } - position: relative; - h2 { font-size: 26px; margin: .5em 0 .6em; - padding: 1em 0 6px;} - hr + h2 { padding-top: 0; } - hr + h3, h4, h5 { margin-top: 0; } -} - -dl.table dt, dl.table dd { display: inline-block; } -dg { display: block; margin-bottom: 1.5em; } - -.warning { color: #c00; } \ No newline at end of file diff --git a/doc-src/content/stylesheets/syntax/_shCore.scss b/doc-src/content/stylesheets/syntax/_shCore.scss deleted file mode 100644 index a67e4f90..00000000 --- a/doc-src/content/stylesheets/syntax/_shCore.scss +++ /dev/null @@ -1,216 +0,0 @@ -@mixin round_corners_custom($top, $right, $bottom, $left) { - -moz-border-radius: $top $right $bottom $left !important; - -webkit-border-radius: $top $right $bottom $left !important; -} - -@mixin round_corners($radius) { - @include round_corners_custom($radius, $radius, $radius, $radius); -} - -.syntaxhighlighter { - a, - div, - code, - table, - table td, - table tr, - table tbody, - table thead, - table caption, - textarea { - @include round_corners(0); - - background: none !important; - border: 0 !important; - bottom: auto !important; - float: none !important; - height: auto !important; - left: auto !important; - line-height: 1.1em !important; - margin: 0 !important; - outline: 0 !important; - overflow: visible !important; - padding: 0 !important; - position: static !important; - right: auto !important; - text-align: left !important; - top: auto !important; - vertical-align: baseline !important; - width: auto !important; - box-sizing: content-box !important; - font: { - family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; - weight: normal !important; - style: normal !important; - size: 1em !important; - } - min: { - // For IE8, FF & WebKit - height: inherit !important; - // For IE7 - height: auto !important; - } - } -} - -.syntaxhighlighter { - width: 100% !important; - margin: 1em 0 1em 0 !important; - - position: relative !important; - overflow: auto !important; - font-size: 1em !important; - - &.source { overflow: hidden !important; } - - // set up bold and italic - .bold { font-weight: bold !important; } - .italic { font-style: italic !important; } - - .line { white-space: pre !important; } - - // main table and columns - table { - width: 100% !important; - caption { - text-align: left !important; - padding: .5em 0 0.5em 1em !important; - } - - td.code { - width: 100% !important; - - .container { - position: relative !important; - - textarea { - box-sizing: border-box !important; - position: absolute !important; - left: 0 !important; - top: 0 !important; - width: 100% !important; - height: 100% !important; - border: none !important; - background: white !important; - padding-left: 1em !important; - overflow: hidden !important; - white-space: pre !important; - } - } - } - - // middle spacing between line numbers and lines - td.gutter .line { - text-align: right !important; - padding: 0 0.5em 0 1em !important; - } - - td.code .line { - padding: 0 1em !important; - } - } - - &.nogutter { - td.code { - .container textarea, .line { padding-left: 0em !important; } - } - } - - &.show { display: block !important; } - - // Adjust some properties when collapsed - &.collapsed { - table { display: none !important; } - - .toolbar { - padding: 0.1em 0.8em 0em 0.8em !important; - font-size: 1em !important; - position: static !important; - width: auto !important; - height: auto !important; - - span { - display: inline !important; - margin-right: 1em !important; - - a { - padding: 0 !important; - display: none !important; - &.expandSource { display: inline !important; } - } - } - } - } - - // Styles for the toolbar - .toolbar { - position: absolute !important; - right: 1px !important; - top: 1px !important; - width: 11px !important; - height: 11px !important; - font-size: 10px !important; - z-index: 10 !important; - - span.title { display: inline !important; } - - a { - display: block !important; - text-align: center !important; - text-decoration: none !important; - padding-top: 1px !important; - - &.expandSource { display: none !important; } - } - } - - &.ie { - font-size: .9em !important; - padding: 1px 0 1px 0 !important; - - .toolbar { - line-height: 8px !important; - a { - padding-top: 0px !important; - } - } - } - - // Print view. - // Colors are based on the default theme without background. - &.printing { - .line.alt1 .content, - .line.alt2 .content, - .line.highlighted .number, - .line.highlighted.alt1 .content, - .line.highlighted.alt2 .content { background: none !important; } - - // Gutter line numbers - .line { - .number { color: #bbbbbb !important; } - // Add border to the lines - .content { color: black !important; } - } - - // Toolbar when visible - .toolbar { display: none !important; } - a { text-decoration: none !important; } - .plain, .plain a { color: black !important; } - .comments, .comments a { color: #008200 !important; } - .string, .string a { color: blue !important; } - .keyword { - color: #006699 !important; - font-weight: bold !important; - } - .preprocessor { color: gray !important; } - .variable { color: #aa7700 !important; } - .value { color: #009900 !important; } - .functions { color: #ff1493 !important; } - .constants { color: #0066cc !important; } - .script { font-weight: bold !important; } - .color1, .color1 a { color: gray !important; } - .color2, .color2 a { color: #ff1493 !important; } - .color3, .color3 a { color: red !important; } - .break, .break a { color: black !important; } - } -} \ No newline at end of file diff --git a/doc-src/content/stylesheets/syntax/_shThemeRDark.scss b/doc-src/content/stylesheets/syntax/_shThemeRDark.scss deleted file mode 100644 index 83210ae6..00000000 --- a/doc-src/content/stylesheets/syntax/_shThemeRDark.scss +++ /dev/null @@ -1,113 +0,0 @@ - -// Dark Theme - -$background: none; - -$line_highlighted_background: #323E41; -$line_highlighted_number: #b9bdb6; - -$gutter_text: #afafaf; -$gutter_border_color: rgba(#fff, .15); - -$toolbar_collapsed_a: #5ba1cf; -$toolbar_collapsed_a_hover: #5ce638; -$toolbar_collapsed_background: #000; - -$toolbar_a: #fff; -$toolbar_a_hover: #e0e8ff; - -$code_plain: #dadbb1; -$code_comments: #878a85; -$code_string: #64b041; -$code_keyword: #6cc7eb; -$code_preprocessor: #cd5c57; -$code_variable: $code_keyword; -$code_value: #ffa0a0; -$code_functions: #3d95e6; -$code_constants: #e0e8ff; -$code_script: $code_keyword; -$code_script_background: none; -$code_color1: #b0b76b; -$code_color2: #98f77a; -$code_color3: #ffaa3e; -$code_color4: $code_plain; - -//@import "theme_template.scss"; - -// Interface elements. -html.dark .syntaxhighlighter { - // Actual syntax highlighter colors. - .plain, .plain a { color: $code_plain; } - .comments, .comments a { color: $code_comments; } - .string, .string a { color: $code_string; } - .keyword { color: $code_keyword; } - .preprocessor { color: $code_preprocessor; } - .variable { color: $code_variable; } - .value { color: $code_value; } - .functions { color: $code_functions; } - .constants { color: $code_constants; } - .script { - font-weight: bold; - color: $code_script; - background-color: $code_script_background; - } - .color1, .color1 a { color: $code_color1; } - .color2, .color2 a { color: $code_color2; } - .color3, .color3 a { color: $code_color3; } - .color4, .color4 a { color: $code_color4; } -} - -// Light Theme - -$background: none; - -$line_highlighted_background: #c3defe; -$line_highlighted_number: #fff; - -$gutter_text: #787878; -$gutter_border_color: #d4d0c8; - -$toolbar_collapsed_a: #3f5fbf; -$toolbar_collapsed_a_hover: #aa7700; -$toolbar_collapsed_background: #fff; - -$toolbar_a: #a0a0a0; -$toolbar_a_hover: red; - -$code_plain: black; -$code_comments: #3f5fbf; -$code_string: #4fa33f; -$code_keyword: #7f0055; -$code_preprocessor: #006699; -$code_variable: #aa7700; -$code_value: #4fa33f; -$code_functions: #b553ba; -$code_constants: #0066cc; -$code_color1: gray; -$code_color2: #ca6436; -$code_color3: red; -$code_color4: $code_plain; - -// Interface elements. -html.light .syntaxhighlighter { - // Actual syntax highlighter colors. - .plain, .plain a { color: $code_plain; } - .comments, .comments a { color: $code_comments; } - .string, .string a { color: $code_string; } - .keyword { color: $code_keyword; } - .preprocessor { color: $code_preprocessor; } - .variable { color: $code_variable; } - .value { color: $code_value; } - .functions { color: $code_functions; } - .constants { color: $code_constants; } - .script { - font-weight: bold; - color: $code_script; - background-color: $code_script_background; - } - .color1, .color1 a { color: $code_color1; } - .color2, .color2 a { color: $code_color2; } - .color3, .color3 a { color: $code_color3; } - .color4, .color4 a { color: $code_color4; } -} - diff --git a/doc-src/content/stylesheets/syntax/_syntax-theme.scss b/doc-src/content/stylesheets/syntax/_syntax-theme.scss deleted file mode 100644 index 1f423063..00000000 --- a/doc-src/content/stylesheets/syntax/_syntax-theme.scss +++ /dev/null @@ -1,8 +0,0 @@ -// Default Syntax Highlighter theme. -//@import "shCore.scss"; - -@import "shThemeRDark.scss"; - -/*.syntaxhighlighter { - .keyword { font-weight: bold !important; } -}*/ diff --git a/doc-src/content/stylesheets/syntax/_theme_template.scss b/doc-src/content/stylesheets/syntax/_theme_template.scss deleted file mode 100644 index c647cc12..00000000 --- a/doc-src/content/stylesheets/syntax/_theme_template.scss +++ /dev/null @@ -1,120 +0,0 @@ -$background: white !default; - -$line_alt1_background: $background !default; -$line_alt2_background: $background !default; - -$line_highlighted_background: #e0e0e0 !default; -$line_highlighted_number: black !default; - -$gutter_text: #afafaf !default; -$gutter_border_color: #6ce26c !default; -$gutter_border: 3px solid $gutter_border_color !default; - -$toolbar_collapsed_a: #00f !default; -$toolbar_collapsed_a_hover: #f00 !default; -$toolbar_collapsed_background: #fff !default; -$toolbar_collapsed_border: 1px solid $gutter_border_color !default; - -$toolbar_a: #fff !default; -$toolbar_a_hover: #000 !default; -$toolbar_background: $gutter_border_color !default; -$toolbar_border: none !default; - -$code_plain: black !default; -$code_comments: #008200 !default; -$code_string: blue !default; -$code_keyword: #006699 !default; -$code_preprocessor: gray !default; -$code_variable: #aa7700 !default; -$code_value: #009900 !default; -$code_functions: #ff1493 !default; -$code_constants: #0066cc !default; -$code_script: $code_keyword !default; -$code_script_background: none !default; -$code_color1: gray !default; -$code_color2: #ff1493 !default; -$code_color3: red !default; - -$caption_color: $code_plain !default; - -// Interface elements. -.syntaxhighlighter { - background-color: $background !important; - - // Highlighed line number - .line { - &.alt1 { background-color: $line_alt1_background !important; } - &.alt2 { background-color: $line_alt2_background !important; } - - // Highlighed line - &.highlighted { - &.alt1, &.alt2 { background-color: $line_highlighted_background !important; } - &.number { color: $line_highlighted_number !important; } - } - } - - table { - caption { - color: $caption_color !important; - } - } - - // Add border to the lines - .gutter { - color: $gutter_text !important; - .line { - border-right: $gutter_border !important; - - &.highlighted { - background-color: $gutter_border_color !important; - color: $background !important; - } - } - } - - &.printing .line .content { border: none !important; } - - &.collapsed { - overflow: visible !important; - - .toolbar { - color: $toolbar_collapsed_a !important; - background: $toolbar_collapsed_background !important; - border: $toolbar_collapsed_border !important; - - a { - color: $toolbar_collapsed_a !important; - &:hover { color: $toolbar_collapsed_a_hover !important; } - } - } - } - - .toolbar { - color: $toolbar_a !important; - background: $toolbar_background !important; - border: $toolbar_border !important; - a { - color: $toolbar_a !important; - &:hover { color: $toolbar_a_hover !important; } - } - } - - // Actual syntax highlighter colors. - .plain, .plain a { color: $code_plain !important; } - .comments, .comments a { color: $code_comments !important; } - .string, .string a { color: $code_string !important; } - .keyword { color: $code_keyword !important; } - .preprocessor { color: $code_preprocessor !important; } - .variable { color: $code_variable !important; } - .value { color: $code_value !important; } - .functions { color: $code_functions !important; } - .constants { color: $code_constants !important; } - .script { - font-weight: bold !important; - color: $code_script !important; - background-color: $code_script_background !important; - } - .color1, .color1 a { color: $code_color1 !important; } - .color2, .color2 a { color: $code_color2 !important; } - .color3, .color3 a { color: $code_color3 !important; } -} diff --git a/doc-src/layouts/partials/example.haml b/doc-src/layouts/partials/example.haml index 557820c7..1b86ef56 100644 --- a/doc-src/layouts/partials/example.haml +++ b/doc-src/layouts/partials/example.haml @@ -4,7 +4,7 @@ %h1 Demo: #{@item[:title]} #demo= example_html -= yield += yield if block_given? #how %section#markup diff --git a/doc-src/layouts/reference.haml b/doc-src/layouts/reference.haml index cad6909c..67694fee 100644 --- a/doc-src/layouts/reference.haml +++ b/doc-src/layouts/reference.haml @@ -8,7 +8,7 @@ %p.beta This module is fairly new and is currently in BETA (β). -= yield += yield if block_given? %p This file can be imported using: From 09dd9456e13871cb5308917f3f822c6a4b4b4b29 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 3 Sep 2011 15:56:57 -0400 Subject: [PATCH 078/290] diagonal layout now goes i nthe correct direction and refactored some internals --- lib/compass/sass_extensions/sprites/layout_methods.rb | 8 ++++---- test/units/sprites/sprite_map_test.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 258328ac..72eba293 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -57,8 +57,8 @@ module Compass def calculate_diagonal_dimensions - @width = @images.map {|image| image.width}.inject(0) {|width, sum| sum + width} - @height = @images.map {|image| image.height}.inject(0) {|height, sum| sum + height} + @width = @images.inject(0) {|sum, img| sum + img.width} + @height = @images.inject(0) {|sum, img| sum + img.height} end def calculate_diagonal_positions @@ -66,11 +66,11 @@ module Compass @images.each_with_index do |image, index| if previous.nil? previous = image - image.top = 0 + image.top = @height - image.height image.left = 0 next end - image.top = previous.top + previous.height + image.top = previous.top - image.height image.left = previous.left + previous.width previous = image end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 8360b086..4adb7622 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -126,7 +126,7 @@ class SpriteMapTest < Test::Unit::TestCase base.generate assert_equal 40, base.width assert_equal 40, base.height - assert_equal [[0,0], [10,10], [20,20], [30,30]], base.images.map {|i| [i.top, i.left]} + assert_equal [[30, 0], [20, 10], [10, 20], [0, 30]], base.images.map {|i| [i.top, i.left]} assert File.exists?(base.filename) FileUtils.rm base.filename end From 8ae841785a883be911feb4cf899cdcfdb82dba33 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 3 Sep 2011 15:57:25 -0400 Subject: [PATCH 079/290] updated gemfile so rcov will only install with mri_18 --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 242b7ea6..f4971264 100644 --- a/Gemfile +++ b/Gemfile @@ -9,10 +9,10 @@ gem "compass-validator", "3.0.1" gem "css_parser", "~> 1.0.1" gem "sass", "~> 3.1" gem "haml", "~> 3.1" -gem "rcov", :platform => :mri +gem "rcov", :platform => :mri_18 gem "rubyzip" gem "livereload" -gem "ruby-prof", :platform => :mri +gem "ruby-prof", :platform => :mri_18 gem 'mocha' gem 'timecop' From b7f44a48d375e56433fd10699874dfb0ce8fd23e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 3 Sep 2011 16:32:57 -0400 Subject: [PATCH 080/290] sprite layout tutorial --- .../tutorials/sprites/layout/diagonal.png | Bin 0 -> 38943 bytes .../tutorials/sprites/layout/horizontal.png | Bin 0 -> 35326 bytes .../images/tutorials/sprites/layout/smart.png | Bin 0 -> 33991 bytes .../images/tutorials/sprites/layout/vert.png | Bin 0 -> 37117 bytes .../spriting/sprite-layouts.markdown | 58 ++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 doc-src/assets/images/tutorials/sprites/layout/diagonal.png create mode 100644 doc-src/assets/images/tutorials/sprites/layout/horizontal.png create mode 100644 doc-src/assets/images/tutorials/sprites/layout/smart.png create mode 100644 doc-src/assets/images/tutorials/sprites/layout/vert.png create mode 100644 doc-src/content/help/tutorials/spriting/sprite-layouts.markdown diff --git a/doc-src/assets/images/tutorials/sprites/layout/diagonal.png b/doc-src/assets/images/tutorials/sprites/layout/diagonal.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b3f93d421868ff6f251fe563a0b9e611e0b96f GIT binary patch literal 38943 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 literal 0 HcmV?d00001 diff --git a/doc-src/assets/images/tutorials/sprites/layout/horizontal.png b/doc-src/assets/images/tutorials/sprites/layout/horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..057568e4d18d2e484e8a80bf77845cc357621318 GIT binary patch literal 35326 zcmXV0Wmp_dw}jwMa0%`qxP>5#1zp^N6I_Bj!Civ8E-t}>I~ydpLvVL@SQgvMoA3UZ zKQr@8cTZQJI#uUHswl}|p_8G*!NFn4$x5lg!NLE2z2H!hU+>V5l?=eaMgEbK64&rt zI_X47e>d;N@SwfVDQIHBIVi{-2=_LFg)6B*amaR&wJLb-uFJQH!G#UnT-V9Zkg?PV zhMZp4&)M4A)$AH55T$(6;pGuiqm>P!=N2m z{X9DQ*(L&+g`QIh7v*ur(S)c7h>L&C?YS2Bbvo1g{>w4T;W}5wNUf7AF7LtU^^qZ7 z-ph^B@U3sGw{qTZ9{MwpB5XPtrfIKoDWj^~f`fv3 zd>F*IDIb@I6v=mwg~4-HU)%kV2u-0j&28ICH(wC^O# z!f{=d-n(RB|9hp=2=V64GV0 zow`E=x)pr?Z^kN!R>7dWQ3$F>&nmG|M>uOH4x9zd|xk_AI)d`dg zKyV%PHIre$CjtT1%z4MJf`(H7A+SYnO>)kcPj*p*^#r}4>p#O!TqoZFZ!STf~ zhUCFJTZ8Dq{y4?zHEM?IX^;Km7)6oU`?cC7B4Lx;hNAIVc&%v%PZx-BzSf6?`NdDk zV@)PmE8$kU4!>6fxaKZvnb(!==iNn1DUwGZSAx$u?}`9L_gCu5SLQaE)yI@HW}F|_ z_6^vzW7ngZL?KX|U9XCNTaktsQR-xEGJQ*xF!4RB$@5r#I7*c3>5M%}`8ndMK>#wA zW9h{?qQrx{*W#OnQZ8)nez4=+tKS$3c#teYamr$~!SoU0vbdsVNxfJTVwr7IJYHMq z-QOj&G!jx=T&bu;>?g?RN zG0gSHJa_;r*z*POGZJrq@!|FXLa<*;ZC`xqAh3|y<(xkm}QGBN4yiI7P0Iu;$)NnBeYNMVu^XyLK zjA=ssAQnuMS5zcU);<081EAGrYYy6@hc;Q|D72S(v@6&yQTJWKQc`}>r%_RZ&JjAx z{cln@@bD?(daJ3EmfeE-WLDWBc7bBXnjhcUTU%M(AR&lfL4AEL$%<#JdLA^3J}y(Od@ldD1vQ8fm=v#Pi>PSd5T8!QzPQ|j z$eOM56B2*Y+}}lpu-J8FgkT}&BwwwO$F8AXU1120P=pS(n1s(A|^h!S@+9&twkbak&E_s4-{|^29Q5YvET*s}5^G|Ou74pcy;CXwJ_b0tZB-Ti> zhmgI~$WqIaA7xgOfA0Nckem>M}fF)JV&VA*UWWCJp;H0@&to-OuL2##(h;iABn6*nGzf#EDIgQ@hS!H z<=oi{K=2+XEOuJ69_D_%KG!N{w@Q*L`F z8KEdRosZE72x(_#pP`y-`y5^Oy8x2jE~-KO{C{E0OCcaBNos8DQ{2s?)y@g~k>M|~ z>&Fn1j>;)qiu@10YyiiNvhUsflzvCB&y@F~RgLV1MYo2f)~5=Q9ZzoFASid~;`eEYFMBSg=1Q7Wv*Tww6AT$mo zy24*4t@M|F@X?@xasl?uD=0O!ShqU)mEP~(c&270dSyHYyhmvE z_{Jg3CJQVkrQ!$lEBkhlvbMI??tZ#b$fmy#Cn%En1336|oBC7p9%J0R!lq-3@ynUIfPpg@qhBm<)Gi=Up>v`W>jzmw49{R%$+TjCAdapu& zinlkN%^{+bY~ zE0W2vLC%O?3#`$$^B+Hx!rP=Obd=;2xZVj419M9T%L`{)%;;(!O{;8g-RCpEM|KFu z%iPJi5Pz*6*yW%^M99&A+w+O}^-@blB!?H-D^)JeI6YQWwXFDXsofNnaP1Eq8Uf{> z^erdb!i3hG%7ux;VBOl)4_IaeHkKxjah)QaiBFkXS=OFrvPz%38_+`2fQ&3S033TY zwl@8pYv|6M7`1V_aIpB*RhyKsQmqvbk0wJZeZ1)2#p~$gq)5oVJ?RCSLA4_C(Gv=& zJ9=_!8|HGjd+{*mhB=$8WIfOQjxstxlcEF{KWqG|2gmKH!&sS_N9o=)Ab-$eu^ub- zRmX=GS?RU~Xg^iYbs-fCBQNJ=ZM$;yE1K%mhQAS-rul<>>_Ahlm+0pYC6mt9G5XpD&s>778M7~ZNo%H@ z-zA_}ahUSc7@?Ah7h-vLEg9m6628Et70GlqYKQDvMVta4CPxx|m7M>4Gbnw;Q0Ni*d zC)Spn#_NBThVCi+TdMk-hN#p!ya=?h-A$$kW%ZVAzjTqItW72u6=^V4?!)B`PEr~l zDtgWjL}s!l*jTr+0J7+`d=}#dOOFx3w)lnO^pXR;-Je@}waYjapQE&pkx=IA7D$42 z&5YF%FkeR!__U%6T9J8cWPC9Ca%nDr^t=XIYBKJtFN&I?J>qj>~H1u2GsdJFUVtZZZly}hma0`@C(^^~K>Pkf@k zG_Ma81Xl{ySaMRciqRN|?(mmMm5KBrm8273xCC@i?5Q>{tEb~6LqyV2Y#g`46kT8W zh>(~)8%E&ZpC(YepSfeep4PwLEJwUG103~0LFhKDnLnNh%{Bcjls&Z95uG(N#`>mI z?iegL4jnK2|2)L%P2Fyi?nqCu?u0j9q@=J47OC=cXsM@*O7F%#_5#q56U9Q&5;aZm zB7au_P?6CWIDd$Shkt%a-ICmpfDzrdurYBNCg63f$(nDf?w|E63iBmTf680yXOhNv z44BQkC<=(SKoA{B2(O%T43Xou9_>>Y%B1P=Lj1C2wWp5=|53nt?1r`O7?e zR3FpmaosG1utZ=(IUE}v5=~Q6Q^LeCYi0Nw-X40j2G=2O+?}4lKn1F=1xph}ANGQt z#G0O-mvwGM8ZB;@_?8_OS%ygVLym(zY$Z+c+3fHML?7%5a@nr`CvLdl$!d)+b_$o7 zSK4H4jihMDfK-8oNnN}o`V|h{`~*+N#Xap8b?T?c*kVO;>>yoEd=W&ZO^Xb(@;QzUd!rW zL;ef%m??$ySnMw~`@qHxUeu@{W5@WM$~XP8wx@J9_D4x>qVLU!yeNGmH5Ov!$ZIo zsAb$i_?||wtf@t8kys^sip0Mw;em*q9@hTyxAJ3}0SmnDoHUj+2yaGxO~d(cLp?RlWV+R$N-ZyeC^gv5UUODs z7@i=x-pg+9t+X++C;jOppxsmH~-C7X{l;#)b#c}>Tz^WU<4ZKUb}^| zZb8`7-ac&bA#8|$aCC-WB;0$_)ioPLi0D^~;q={F5Y-Dsh^Ha2c%P9x)R4iZ z{w0?+7p2eRvh|y_t(`+}_N(C3NOrCr*~t|i((hkhwl8Ty#(`cJ7V*`1`ac*U9FpVU zv{ero?0ldR%?)e4J%apa5b!Alw1U^iVHahae|0kRhMSrKJJybw3H0UI9fTO1Ijk0a z3{?u!gxA>7`N+G+lewrC?UZ58gTrJF2KNJY*Z~D)*k&VXN;v)2>Qr*%f z{Rc%pZE?<9AD{@)EIX^c1LXNqM<444;4Mn&S{=SoO=r63aE%`wZ)@*ygJkK&^cBd+ z$({%2Nh6iyw|XBsb}vlSeFK&?T&M-1!hsCuN%5O+b;{r6W9B1s&4<}d$%Zg8F=3&Q zGIp1gFw*5@%H@e7E?V-;POl&{kdTm*>%H0Pys}C@v&BT=b#VW2Go`*0 zl}*oqr@W7s?80GQU|%S9_QpdpyFq0n8v=;nNO7C_ZAE85hOJ6}mPCWE*u{IxFI7Gd zkn6@N`;R)Rxn9xYAn>-tA?V7N*lS~Dt2H-B(YCC$Lelp5O07_P@;;rB{Ra>o5~74Q zrDX3A(ILFC7d{FR^$adgvZFg!wFytN`Ib}ycN?}qbOk1!7f7KedpS#9}G1hiyK24bc#li^h zrDSYlFB2$h<4wX&PER?j+(K3`xu(&!3Y-y7p0d)wquqn7uzS#$y?G42C@Co!ZI$XC zsl+TosWMr^?Y`hl>xt|?bsBLy5D;Y|Sj%w|<*b0M#;jig>9f2IDfE^WSxt7@J_e|D z6$ymNA`-=m^2r%a$!#Jt=H{~$#&vcHp2J2=X&x?X*~zj`3XIE=BsP(~sKQKDKkPX2?}1EKEED`M;<9uUy~{lGsWW?Es~BAV-4vs zO&w7fw#5&9%#f>p4YkF1QY;LfAQN;|lDB(2v|`_3`z~FpV=p^lS*i4M#moHhYaVpg zqQr+8^(*5^xp4`A73LZtkm7G5`w%OAIoL9uiEYQ(lWck}U{X1EQohankul>1%fd80 z;}VyXmlr4#M^Q{gNtq|q!E&_!vR@c}HAIlRrY1333Hyti_i7-bO-}1&e(jCA{_;nS z4pgi^tk8-WSM5hfqR{WYIHR4Ra5!lkk2fn32{HPLI~((bV@&fCcd9USSyly~|JsuD zt?s(!r*WJ94ZSlyn(AT22B{eFAl=O{qA>57awH{I6;J%6?NBcXR*FmtYF^%G=1a1W zXx~j?1cnGs3~M#4u$lw;kq3a2;9>`7bvrT2=Ts{0>7AgS{l}l%YnjEF&aJ`@Bcyx5 zIyd0W3A!H=zv~jEb3w&dyoA@&Yr!G}R{9D;?kDu4wca9zUjDy~n9~c4sbv*oVs7>V zo2||RlWwNm1sdDkHoG8?$@goLlvGLxwTxE+^cqfLuTJI>;sGClN^Z(;C&Szwr;3#R zFs+E8b0dy7n^?08Q-zIgNDX_)luEcA*_iQ+D0?6E2|@>D--da8aQ+%HYgbsyN76Q& z`*ON`TW8_dujHC4P<(6XN8E)U%<+;>f+Xo9%>roc$xOAUB@?VU#7E&yMf+jC1V6np z;8i35G+t7u=MLn8|Fto*&5~{m6;Aj~7A0%dR{kVkj=GOo*V9G!^oay>&^F;{EF0qk ziUx3gD3Yn z7ShUt!#BgJRZm}2e6KK_53O}O7L7yGaaYW55)=}0L&1@0Xp@6S+%qqrAJBs>*@!Sk zpXAY&!SgY7OP54xI=?7$@58$s0X3QLLPpJBEt(P|M(DZ&%W4DXstgorV4m4`ad)lG z4+Y=XpwpcKHz8Zgp9%_UYzw~HSkK&h${b}S>6)2+q2HFNxCP_d;Qn)bzj%Jd&Ch*2 zVl$mBj8T>MPpV76j*^*=n8KJ>p9H7w{(dvOqbKXpTOuG0{gyo)iQMy!K=}6R>T=lv zeP%d9iS;PP*~L=)`HaF776Qd7Df1m&yPr(rhm=zlx1Q0jW5}{?g%jVYmGgEPGiQzMRpmWo82etseRhEd z7)_S86Mb0xWpms~U}a}=7OiG~MR15eAp65;3!+Y++0TM-HGkjcM%>EnG<|g7pDs}E zB|srKFW~^5mmcy#;p1}~v{l%vb3MCZ{!E+H;C`xhbab@${iyk@IU50Ki0%%T(Q-6} zpPyGn*#STyN_vYFl&^gE!OC?r--J0M-{rjj#^ctkVSf1{=Pysb-<;uF)tJ4^h+GQcht0#8xu#;| z*ZMp1NS8x@+l|o&n!IrQ#5}2^1iQH;S@YLd0FqFPdyKCNv&)&^e5GY1n5(Ai*uwMj zx*4$?SEYaETZ7rXtih*#a5+PEn1cx6$9$fNG~cQ=}ytr7$5GVN?JzoAb@%V@!ApWB)C8?zu32G8$BBrrDuPyTCw)@S^&9LwC z(vrcZW0_dGdP0P)v2h-B;bKw}r4VBxVq`gY8asMrA9UaG5dB)mC{qexAgAIeD+Zn& zu12_a1=I@Wl8lB18x#u5QxK~6W;Ik(Qf7F;4J)hBWN^J{ssw7Afj~3EgK?wXY6Lm@ zSMK;_av@*Rg0C^am)uZjFugQ;uw(3%)yKr!$V!1iU%fWMwzsGvkXoaN8lDkqinxJo z)9vkT-)Lfvf?w9Tyg>_Jt9kaCwrWXejHPDex7+xVHa@7ASnC!$Ul$KxW^))>GK^yX zlIY;{3EYb8BN;~{S{jdwi7B1dGdcC=T9#upSv}p59Z;ih2C=lbtE}q<(s|-TRhorglK3KOH6+ z%!4~O@=b_)OkeG%WuKZ!F0R5!xZoemBs0kt@jE%{4F^&GmzA39OO8v(vqzVf6W@q5 z3p4W*BEIoZY*?g*tU0rKK3cNq0uwD=oErZr1E3<{z${^KC3WTPpQ8THMnm$1Wm%y5 zK@OvDZ-zN+`5DEl8duZte*k;pUI^C!dt)t*v5OT>GoFs3y*4`wuXfeLt7R!cSrZq; zY(pNuiRvsCK421y;-(cDhNePd$fZ_1`v<&ZW!v^zzJDIV-bRbj+)AH z5_E-{DMPJ@6&%Gh4jiAbxZ8JBdkqgs|CP$P;8TCe#)!v(O|#jyS>uhf3_>~E9|r-x z>(M$DVr*hjBlk*jGog4eClb-u-3?%fUupdkf@306SS20jM+ZEaZpc2=&MT3tu2onPM)28NstHrTw;L!Y9#_sLUb? zUL(GWN!FriX|*ZTqi5CZWK>jo1M|OfYA$acH3d}vD|q7ODSpb{nA$@zxp;?f%%qwg zX?>I(vjChaWsf54;>)^Xjk{)L>h7?<8hur_c`wEVk}KJ~{(Jtv2SjYt%g%*>J-EW@ zFOII?Zipwc1v_1PAFvXsIpN3|;$7v!#;_D;S7w2x+l5FxpzM)Z^q(Ud&W3WR?mVS5 zjacFsL80oX*;YR$T6Q-4?k{M_$jODmT{Z)a^mVjtn7;hY?Q+~)iQx=3sUB1Fy;=e~ zH*zoB`>0f~@gC}kuLcj$!)x7vH!*mGDf9YEux+fZ%c%i$-xc%3{CY5Bm>EQqQ0wQ8 zvo!+4SY|orbrDgoMrwop;Gx$2#6%7bG<)Bgp?NnSire;3|B8wh=Qqi8JFe95?ElWJzJlL8z}h@?n}~_^rcYEQLS>@zrx5gh4d)0_ zkeBC(_13r>^Jgpe1@q1R!=HNazKzYLZPkb@m5FNVZmEkW!jb|wAqTPCCa;|yTxorW z2ra&@OaD0s&NgC_qY}o+xLt>SaWGW8)mC}|q8qjQcx{{ohp!p5pYGWu-$K!2KWKfv zcV%QiQ$Y5)en#~UmPY6G^eA|Thi@!QDqw;Zs`*h{U@RLR9jVu%z|NFi^{04T+}Z*d zgdC2{1%dEwi|<5fR*mo9%&V)b>lu03tp^L}`xjb-((QbyJ+$bcb-UtP#|UzE18rO(xe}@fP$|D^;#HKV3(z7lA1M zt?cLhA#zaTpz?dE8GYMwxh@a&r_FceEr8dQmzC!CO0&Bjf^RV6P0?@aY~TvB62*6* zUZ?8JC#`srPeVUrQ0(GJ_xI{{QCXE;6-$ni)^aV%5N4^8@;>`j|EZAM4m1L|g)pZ) zQBvJ-@X~EjXZw18*Qfi~t)Ei~o9oCJ*%ciOK7~Dw3!!v%joCxtwd(q_kl85Pv1c57e2N@6uet9rbHbam^yW2Z9odd2=F^KebR}V1vR*!_-uY z!-%a*IAN9vpj~}L9&7FdYPw*!uW$JCUrt{0CW{)l7{L#ijB#jVzL{!iMvVTD^QiJj z_UF#t@A|BBNpqcHH=F7}Ep={;)DK^dxcl=Zz65Ymh*Ww3My`1*v#v3C6?RL#GM>iY zF}=<43B|c+PgcN2_dq=>Q_#VGs;RJBsw*#nkw!}KpZo6aDu?&bcvxBz|Jh1N^Z{`~ z^M48rPRItFCP4wk5GK;0Ut9r?&n3s;`LcI`-Q?GPJ@nu(M>;ISF5si#Vpg1Vq0xYc zsgf=G-~_Fk=o*@6jenXf{mbD^#tbA^#KWDzUpa|!l{@mQd!PNHXg2kc~euI(~ zWz|d&+UXHr`jyp-T*i|ZAaNMEj=OCN`wVzFv$s368T;EF+qb}grye}|hNbr@a%V_a z6^@9flVC_WQ_R3``cwPR-^Tb9v#1+L>}!PYt4RW%;mM(l7fT`W zkc71AJCW=y@mrj*Fk~Un_m{=+vzAk(s*3ik#PX1L3#!z_QE2b0Yx9RjR}~oq;mx@8 zc}hzOX>sEQiry!ePmX$t#jn5CyjZ{F`^L!~;#{n{C?3J#_q7acL-n+D*SF3cEKJar zCO%euzx_`9PN%)e_hfxfAM4Qc)%J$QrD;(PxwfSpY!`w{onY-PFy;NZ>A+1myB2$< zRmWAg>FlUu>y&&9L#+@lQl3a4hmx7aUkOAx-B#6lb963kiDa+#%;Lx)G%vt>rD3ns z$0hI0tOpQk6Acona`tcdYi%vZ6kX!&@>lFI5Y9XQ_1Eb_o= z;=F~iwIGDk>P`IEIBqzd`AH6l%@r7G4XgL1k!usg^q*UX_!PBltC5f^XrS_T4ny>;NS3Lbjq(U0| zGyrfNjPhDiJvD4{6^s;%NCf(jG>911q#!K~-F!)Wr#EiY-8VQqd5$yO4ZA5j0zBARGdxk8#G#{Ls?%88~!-zd;ExvwI6{+1|5Kl15 zFOTG)kA3HLu$r& z!|!Ro3BJ;B=U~+m7k3X>leP~rwgT|l&-6LKO;Wfs>q@#YjDY~tVT!1d{z@5bxOHyI zc!MWd$v-ABmyTfcS%?z4K0T59^x5v4XU5#$LhC9K;5Xmt$WS#W!xGN;%UxPQ=2jjvr2V8aU6@d62KkgC|rHpe(YcIeUn&YZ1yQUD~8V|L}q8 zg#MjNb&2|qRo6iWm$H={7%O)<|2%M8&HzLtvE4~ zZ1E)s)g0a+{ZvA1O*u=7X^(FNA43Qvp184P9@IHcUO z8*-6^d(7q{uMuD5we@7f>CqN;(&AYs}VuZ)$fKYe; zOKAkv(w}{IvLtowN5&=D3t{}(ecGwPWx&H_1=#y;C8Lpi&cT(R@>SPwMDLq}x1U_^MJ&Wi7}~mx>Dw4sI)ujmp2;>StGj@rjJ(x#3^y*c(wR?F@ z!QIpmzY+lRwwd04QS<)$QHE&L6?`9xjAz(%&)w7Z42*w>PGMxqX76-!#ZIq|WIV0W zCM$6F5Mb9eK+kE3T2oA>a)6G^3JeeCxD$omlK-qTrZCjPlMZgOVeOI%{SzYt?Zw1m7SkIOzdtbMN|BoxI;a zFfd-r{lJg2=l^Fw7&AO=-ERx_u;It%b_eKe@dU{4UhzaTN|KL;%xP(nvey4d=w{%c zf)mqL+F`o(uTyhv7m+Rtw!Z5-w%O69;KrAvVV3!?E@x~I&*h&{8QoERsyqKcS!ErJ zs~)azvcZ-kJ&yg_DFP}U8xiix#?ujrA>o`DC}P2jY{0qn^o(eRF~sRotay7#ePhya z7Wk3ps3?=uH1Y&h-R@*g=e{k4s7Ms4!H>b%IYsG7>P@H!>-nFSP&#o;@;$A!= zu%{myqyNbp-^m*=nbM$5ATc%h7<6L+^m*-1iRDH!%e`Mg(Hk;me1?Jio>;BpQb~7g zqkuqQ$ZL~LRG&8WZ&wW zSIuirAbzCnqw zK>@y`*O7H9lD2iSpu?q_K&yF1adyrVoc2^bPuAmJETm{Sy5A7@vRBA@r^o$B9~}Qi zlnVO1EH}|1EB!YLhoD4lxMCDxPR;YR;PL9Tg58ix%KPm2+ zQ3=%2-~Bc?fgZWR@UWf!F!P^l5)C)jH%}HP)~v$5&N_Yy_(O;Hle1&^#`W!X^nR`H zt>1d@Qwun~T92<=*s|};?ZeIhOrxT5U*^URvq%%?Vu96Jc*NJ`QIK&OgCNT@A!VIy z2j^tV<#^v^rF$7B0II*w)5r^^?Td&}LvsM!g1|RTg7NL1d1)md{c74*?dcm!CZ6~F z?V@tF znGCWgK6EnWbqVFuaF*fH8~YniNGtjr31GA(JZg1VagIdUbx4ps-&S=auhB!5-{rsh z+Of$WR6qRuQj~Z0(i|G@1446HC3iT1#aPi#w|rZ4&UiZ@@5z=miBS_;EmYks@O^O5 z^|xQT$2(HWlGj?eCx6znI%8L<9S-9wq@v(TDdaD3M$=$=?@6^jNTiz{$72)x+&bnND9`Hg;5$s#>O zncK^ca9pb6Q}y8aQhyrA8*h;@)lqNEPB8x)nyP6EvQ!1{7ds^H^%F9LF$ zN6xKX!-zNE=(!tt@G|t*Pvh*ZzumDFJ66QUW?Z60NptUq&nPm5R-qPrEzV9U$D!XfMKHztz-FFWf-5;^Xq9N%~R^0dhf`uYy|wb$(^D`%Lne^b4{L4{c|@Dw*Q1LZzKYkYP`nEbADnUt)+Nq@J zwUPbCyt6?r#LKnjD8&{R^n8N9l8y%IGEfoy9$`WktjiBp5heN~jUrM#+YM-cai~9& z(SWfg<6=&uiu^vMNxJa{n3bYBoW*5f?F$*>ZF#i##-XVy4luuI5KoeDj7Y4d<9*2$ z5Acj}8|FIC3~%r{%AA6kO2aTZ`ad;4z%vs>;H<3x22M+d(t97};87opGVBs-w$Htw z^T3drGDA&7tI=t%&N6#%G0ZOZ=VO){s`%sNTNhEzyd(cmo1*3)#30_~tJaTqaKo4-B?>|J}A`+doXCJs%m7tDwgAd6PxB}>`-WHqSz9SP0}hDT;Zo^Abt z95Zy$aCGV={|ce1JWq&I=DV(MWfBl4+pHeGmtghh8WlO8cF(}kw;mIBBv@EjvokZ2 z&(G0i74>?1X`ffhHTCLoJ#?AOrYsH8tRZ4Q@bU3^g@t8_*$p>#e*x71k^z(c#4$Ax zQo|Q`{QNq|gb`v<} z_JDHLL@KqRE9@D;{2MqbwhH9=eTz+1(nH*4Jele5N_i|Nrt>9HGN>(gd}5EgvTFQm z#fam4yqx#>@VL`~@u?n3=(QOfD$jr#IUM{>9OvNg7pdNW@M*2%xvJ8? z74wrpXOwdCR14>6kwmv_--&L9+(+h4x&N$hOqzf4dt#;#atH3!R3T8mP+f^EPAHhg z-m@p=XQH<3p%)B6kz>RJlhmsFY7m$32}rK-tZV|KRMbM6b!Nv{)f+q-PS~1h$Jyd+;V6 z4nwCu&+&`%d)lU&Iyh)pB)v5Lm3B_dP4rBJzZvmxt6zv%_G$%<;Zrg0`ek5V8y>qp z*61|{Hm%p?Ea@&E$|t5A*TK2uy4Kgp8ct-jnt8EY4-(BBM)rUQZ>xt|0a!{rnH3wt z!Cqnn)wyGW-5PCQSEY5EEkt5s;-)KVPLmj?b%PR@!FzYO>wxq~@UT=_g;5gie^o`$ zyQ^TGbLAmfbuHfpOSRU^uq-Qb)-Fe8Vb(fUB2|72mg9P!4?xRusT91pWmHhW@U?SA z8i9Bb=eFq0@4^O42>t0Q1dl?{xn)j9ckB^j-IWIJp>HvI{z(A;o|)OFB@*XHK!*z$ zXT0pQPnLjzjF88f$(C*Ult;k9bOx_^owb~&lGwCs-^H$%5CMhf@UC-O>Q*LA-utQP zj4i$ZMAgy7{o4`K`QX$&qBhtXiuL^XYQuR-XCkVt#>Z}iK3g9nn1i98oZt}i8x0ke zd&fkoy@wYjMf{0ovmv}g=AesE?}Q->vjcHmBK2`?8s;214#`EJG@dD6iP-9CSV?~y zS_PSy?o~&fabKA*Wd!F2j?(cjgsX4X_Qj8)4*|T7FB>3#F=7s_s_htj-^6A6t^tr4 z-aAb&|L1^Lnxdk-3f4PccRDU_!U_6I<#(WZbb44Z;);6Bm@PY5!ed*alghBAO80lo zRX#S3JWiTr#dDYbOEqp16p=w4&6@Tzb=Nv^nOD`q+}x5l;QA6&%(JgF;{krO%Lpt% z7nKMrJs8M9Oj&ODw_`Zz_r}U0_5H+UVM8thcN7hF%h-oNZVKZq#K^q#T61@);H@`b zsTqG|wSS=A^y!LWvUZpty+${iK%|P3^cCh>LFq(*QiHe1ex{Do$sXmgM7nPfCj|_gw>6 zxW?aOTPTgLcmFsfkVN6e4DV$a9;QN7;TEiSE>3qJv2f{I@594m#UsE(VkW^Hd&vEL z&6~zExU|dPA-fGtr*{Pd#5Rp375_&5;P+T_!m(Rv$>_Sh5imELe!qQ3+X|La zS?w1S1@~WP3MKSw*Ev3}8umpDVh6#-}~wv$rL4-##e@f!D`&!d%A0^Mfj<-rc6hqqX|3m;^HO z@$<^XX@A_+XqPr?hlcuJkKCNNOiXqMpKA$iKemWW_&R|yi8cP6SGPe277o8byW;J< zt;@-6z%80?%P;Vrlh~J}1i7d`1!{j4U+rjP&V#Z%F|tiZgg>TS8NZiyc<91#zG4{0 zZNd*f(h%YHrI>REFA-qNHwaTB^a%)x_Jguw{-`E_WTK@Dc)3KC6vq^2m!_5Sjaz;$ z63W4edQbQ^_$;D7tUoQcyw_HzM;X6Ctt$k3jO->4clYUS zz;k3~J{BiVtn!bkomr_!dA$CDpoJoj;t6eLBaLWkax(JQdSnMk54lO`^qi5dL^)M{ z7+Rd6+8j!g%sTh3VtS}nb$Z{bi48O|)3*>Jj56xNA3|QS$NvXfW7rt>3Gnx`KP(1Z zSYFOjx~k>!{V#pDON|)6nu1s{fo$KL|Bee5;U(gsgGoiOoAL&m zE8j6fBL5d%K3$o=54R*%zVsp25#q-|;fITXgHU2np}@NLj5RUA#%H%kp$tSLb+GQg zF}0Qajy*4*ZFV3V2skrKe8)fiD2oHbq>+nTizHAc4?i3r4k_zzhsUTFe zA6DbwpiOy(Op}&%TMUH5rCXl2JlosYTNm$x{O1li9lt({Mq%=xQL2Is|BX@41n{i; zy;(eF{irN**Ybft59?A2m`EkedK!Q2;0Mb_EEtiRzv$a3{>+^km5rf>6%s@cJ@CFd z-;f?(4)0Tjpp?ioqAms}j`A-xduyAjql^08{wx*})Jee03?v78%HnDU}G({3Q-E&5`!}FE9wQ_8st?R4?dC-VELr_5D(;sQzCt;uOiPkoLn_ zfyHBvy3+#~Lln|DWD9ER)Apu|@MYO1lq|1UnIx)i7R=35l|tP4tY~Z#wWvuFOQsej zQYE$~3cGE25@cujWCoihN~E#^4U;pRCyj~hY`!_scgGwH$bEk5!I%)F*b%n}?cOCn zSpQqPqn4j>ng51+*32Envd45=#18c#B0jg4XIU%Sv(M*qU zh0VlSEf}r~nGyIAXo!Zk1dng`36$v$fDn4N_t29?Drqr@f9$6o8C^bq=lF1+v;uzA z@C^A!d-7Moc30=EA}0;Lr%P_Yfc7IsfI?5c&Ugm$3SCd4e=l^MuT_6^j^ikJ80jl0cC4Uc6;s{D#|97^b#FP;aKPk)pYHzXyuq7(N_m&hOgyqB?;YC%RZG@Fg#+L5Z0 zNFB77MV86hL{oF{N(4NKh!j0^lp8NESXzOw&(BwcuPNH7$5n8}lacoF%M9Sw>G1a! zV#ue3PLYuzoO9cRK-YIp!zeb1AfTE-6>s9}hJU{Na`g0OD^iMfc43x&CP#;!IV7J` zvJ$sumLMuTwCRqYjGVNJj5Q)%>@emNic8#JWs>oq@F=`pD+k-s$Mf$hd)RKjiCfqG zf75$v{0l5T41lNS!n`U|qy;v;CM_%vF+=5+gS1*DBvK2{Ul5_$^Im+~11xYbM5 z7lN62B73$81{|!uaqc17g?vb-emfn|_gDK(h+sogGY?vr0Q9wLE)o)f3!JedQZi=|B8KOI~!nF2Db6qFY!kPZZkA z4U=Kl-Yvo7DU*5o1T80?;2dtobayk`ATPD>?Y0jP?KEVdX# za=-51jso}v1k|DZ9h1BKxFky{aJl(81_o-E1uID+Ii!1Z+nRL)JFi-kk*U0~s_N`~ z_*xPv+a!}*?|swlEqf6bIsbnWbVR@{Y4iE9;@>PqM?=C#KSWG@4_GF%-?Y91{ThrX zAKrQrN!ns@A!oev8#{DyL|)WkSi`yYJN(ub()VsC?q`F5VG=u%J(5e-p< z3Tp>(W)5Ps4bD1(NzinCmPD06Iw(YN$N zlSDn&8hPGlz|Ld(a(f_q_SW(qa>4gv*OC7(ukMxdP7nDWvMjlhI(o6q>15AGei7~? ztl=JT-5c}ww&Iz;?tZ^hz;=4_zq3`b3zI^*sMX7ZSsMWsaHWtnRq3ygi#Zp~vIK}oK@ zmQI4!{a+-%=fqui=f2{%2le)vxWXb9-_^dlbw|g?9=Mi4VKQN6M_f!>?|luJpn~aQ zF3yId)28N0!Md8O`@j%$`Y%5*qt`$Txdn5Uqv~Zu^(f&PuYv=)u{Q}{^F6QLl>Qj- zHx>%DMq~WX)b-vGeDr1Xjsd^Z(^FnPE|#%s_j?~h^w3_OGqXeS=zB2~^@HKvin5A| z=&zV^19)d1($yB4ZN{KZ-YZKBQZa*d3oTKPYgt~tE!=jq0_ZQE{a+h~l&PGhUFZQHhOvuT{hyy1KM{k{L+=YICt zotd3;X6EeT!%xc4pd}6Y0_D(WzX!ipV*kf9MdCL?`~PgImhYAn>6(7q&xy-FNz)t* z*AvMy3Gd!&rQYk_ZFzb5Z@D|mvn4f$C0NrXsfDDUHuan@l#W@o0pj&68R{y9NLPkh zM51{p97BAgAqhEsdag}26+wuy9oSe(gD=t}H0r*QqH}@cX_TKBO(whx!=%c@Bwi#< zm9+nehliW{QWPfrY0vX6z0k11JAZeE#{R|s)`bNqaDMh^-%+0X1dd4x1k@CU_V_N( zuhT3U4s4-t{<#T>1Le<Vov#TVZl912*n{NSpC+oyD&`0~br%#YRT z5(wnkGR2%?;=a$Ks1B#CysR6#(*hYUeTQCNKt{|I# zoDk_YTLIxx*|e=CG8MCh8tqOPWhH5~QCk9&es_QH?nLLx-pjBRXMwuLN6OraaUTWp zr*%0sUGCDa$T}=sO;}G4IEVVA9Ez|zkO4Nf<|HYv2`V$KjK~u@46^Aw>B*SzbX~(z zc2EAy+D63X2D5x32|?3a~lT%$bn-|AwSc632q(B%?SV7My<4W`=b&6 znpR(Q^hH9CZN`&mh7%O26)jO$PK*M;T;#K&bcu4T-Il$RKwLv)0~}tXA)s53s6Xp4 zA5o16u09nVZ5atem6LhF=8*cFL`+H)V?>?>sj&91bmse-9*lAwNBRNDr*J)4U3p2p zsvAaMP38JNZ>GHLBX-ywL6+^&X#3RTFf zj+EX{56lW-CpDlr!58g+dB5D9-e|N#;*o|57s-y>$v0=g*(h>)V$YhABiF#dWqZiv zfemNXd1auy3YxMvg$hwsH4KUAysjSIlHGtU6!)v_h(&C?piv+WN_ou)N7f{JH!r$$ zuRbTgJS70OQbF6TriR5uHSq7GLV=_FZMtE)Vn{`YKBmZNC>%DD#+fA?0XRg2pRL0+ zgHPY_q8X}j2-`HK>UP?1Ww8-`lH*k4SVjeTrdyZ)BE)gxI}7T)!Hpt-D}8|IZT-*k z+SZA*=je|eb#;nJM8nX*heD22C;;phTZXKfAa)rL&f^ggRq~VpQ+wXjugLTU8%($< zE>H3%m|5gwE|p_2n~ZOA`ljMNhtvcSTI)m@QLlBiAf7XkETJ6md6i$k!@Ei z`WP)O0w%_iqaV#>a_BCf7wi}&9a80Emjzk&of(Ecw*a^ykS{|m!P}0xy#Kfr7VH;? zL*<_^N=N0ph~e1OErFEhS6=2=3H2fj7TrcpIx>E%Xl9P*%|%oEj7F{9COI4iR3?~W z4Zg}@d?L0avxF|j?sm|YX|_~qIloIu`_4i%8rJP-QTY<`o7_XzirX5ma$|T@S_UrS z`@P2es0Vw-d^XQj&1S&KQxd|T)Eaf|MuG$?B_^;K{Fkm`RtU*A z`)*rri6INBiuzH;Vr4W}M`K$YR8jPtO(>;dZrr=RPFG9@I_yB<(ip^AF{r9VYM-P{ znMa$Mt9e+v*iUb;s;dJR6*(6PQ^nV{zM6de!T~la7c@IHjz$skb_qc+rrhdMw7}5B zN<=nFJ$m@eH?uSg>8NjZPkVhI7AA>n=yH1ydKdT3@MYiEPp7Ou<)8KMn0NgJj+)VG zPpdR*-PL_r$jOL{x%YE80mi&M9H%&M9!m;(1WFuuG3so|rcYSmB3x;8)1qnZq87)ajVD7G>KAAo>*DJdsE?Tw*lkIjb7jqQn#iz zHbeD0TLhSz3|O3Kq*()(?9@UAKhaHi zSsW`4_*o)={FFv@c-y}GNn4bSG=|^>4wjKrX?mv#SXtx;IW(pfWnpUIi3WjD_j^4k zq$WMf&h@=aDEvWYw3jeHXzB@N4*OBsnzfCMsxDYSZ7d`vCIi+ZGm{xA-B8beMsFeK z_wx2yxYWAk&@;3!LS%#JBAjWlsXnF1B?P#aI8EPoKh>MdK%x- zEWce?;-DB&KGo?%nqcScQJ<{mzfYQe2#Y$3Chk`2&RB_MI3q!4!-FkP|5?Y}*9Tv- zp%&U0Ymg2-VJ67LdSWaFwjpS}%hx^j{YOGw6UVEVDgY)Kxp(9l8EY^P!#ha4-}h30 zR5i*NHQk>KV87G_k2cwhfjX;>qLkH(wuBp`irmM{F#ED30jErTh;eZde8e1!o@OO; z^vk(|6x3o697KV>HI2Ae3Dk!#i+`!=8QLAV$$}Lm=t1Xdjo!6*0Qa4k{ynfP`JVhA zg2*^%xWmNpblA`|MrBlYipQLk8^oVXbxR~p9TF3Z4R)Oinp`f5z@(p87iB-_8x*EH z=NCoAa%#9;0g_?E~t6)n)NpQ$c@#X6hbp3ZTbk0y%J zHMDJG5X_XvFRJr*{N!X8BGcuDDm1)K&B?HM%LRmj4(`ZL=|70Q!y-qpqtWYk61zhQ zAZ832?9MZO&BnhQa&~NAeBYRyM2ApDD(~y0z~S|B!;`ZVt;iARY7X0X&Evdx5$(x1 zmX7wkq|kpU*Q`Vk5r~OF?0%T-G%A=EX@*IbK?q2fbEx6essp&UXJVTPHR87+AhsKC$?T2yf;RSB-NpVI}> zq}T|MRkNHXh6^Vs{yaY#tM0y~Lo-kdLyQ!O4*wns&w;tg3>a} zE1x<~Ast7=;gU;9ZT>!Lb*>_=OKbX%=5x^0xnSK{rq2K)sQtAdPG|wkVE)Ew9^ja_ z>)@SvEJXY5l+w42+u;*Iq5rY9y6L-l&sx7I@VWRkDV{yIU1a^%1zB0oJnhRlRFE(f zYX+Ps`$3SKh)pKvLo&RZiF&JkAgjoPJ*^8(U#IBu)(}?rKTme&rq|KWU3irQ1UYx1 zC%(LtVoYahMzI%>b<1gbmSab(fOn*Z(@tZ#GcVmi6D`9tP#<13+KO}CA~p>){pYvm zpuhy4Wo8nSehMN!-Yf{L)J4W`of$93nE>SjX~PKaUYoOhqVoIqXFm*1wytSqX)Hrt zi>&$94?BY+JPOl93QpqwB1ovFk2XI^=N4Ql79%T!0>^u26)AmlOPo_DE5nhriKbn z2fWw+qE5uzi%Zs01piSgc?7Dgni!|S@TG>_p#g=ic)ic|Q4nl#DG(kZbmB4ocX3^r zJ7b(p${Iyymc^ixAx_m{<}Zt~os}wK*^-4O_6~_M4U-@959n1^rF2U-s3kWSmnqC7 z5+ct^^P0fOZXY6)wTv?QK0(_ZWocwf`FG}{?U>RGMSw~mYtw2xGVgW zh^5w>NkZL=gF6Q3K>MzxiPq%i?7N+{(pTZ#`#*tx+eena*N}w5uh{prMovzPtneZ{ zKK?G+k{0L;_R6DNGRS}Im1J&=ep=Oi2Czo0R^L>Up(>~d3JP9hO0G*`>GHE;vjw-Q zBfuPqrOfCm&+{k$Uw)wu+IoZD<2%pDaD@K4oj{yQ$XLU{YKRMR%`p}Xcc92iQ=n^- zF#eWWSY-%GBTuQ8Jya#(RpN-iU5~0X3)CyBlH+tnZ`IEvDcnfsVLTXQz3ESwIx@fU zroc-G2@Z4CS~3qA@FzX768n$g%F5m-0C<=BLD2U$y zo;NZ(-Qk&HH}CQZ6J{kr!E`m{^rs;4$KyBkzoxo9&k62CV-vKU-q{C2NhQJz` zW+B{fvrwFIX^P3dgzlPa7fgtCbuMPBTN-YRID!B9Jzp`MddfWg@z-AfJ0n;Z+FdYR zV8!F1H#LFM>xPLzb zU(Oo!)lq_2_}Rr>xDp1GG*68_Ex>qVXUC2v*|nr(vfTWnRwf`F zp5dqWY(NLyS;2X4riIQy)D}k?mBCH)kL=*zmm2#uC0tt7TykX7GMGmKzk+TIJ%4-Q z;o!7a3JKCo`vcM}t&S#Bn%yp1MIFDXlO9Vf+;lnfhsX${YTgpqbz^-g|67SZBp3lM zVME4#6a|bW0`~%Dk`WC~Vuv^-D4%BlnZ=9@B(RaU_OmwR$>vh+{@%wf9X|=YrCt;V z;*&W#*n{L-4V1ri$=lrKsSYPre5HkbhwB+x&%>gen}Bk>Yqd_dC+y?n(*)dQ#LBQh z(b$h|=C+}PAl;V_@#fVi4rkwGQUfG?=S6 z6{ppf;yO7?JA?^VaY=dI?2ByneLYsDAyE1)#c(g(9nlw$)oNg?#50!Y2SV7X8@3{b z>?|&dt~vDn8x2+h(*K2G;mCY+iazewyFHD9`=c@Vc7t0R3$XVANU?nXMU>L9f0@(> zv(V!qub)n$7oJ5`sPD&!moS-iXLgjl=IGN3@QUKbp_w6uWgcucYqTZyz=qStCqy>&{7DUq;lq3HJ_?TK-m%XVaF_o8L62xwa@eC9$*ftkGoZNLQglSwP;#C<$mms*SH+sWI(4xE2Rm?%HRWi@tc;+pw`7!gP)cNe^?dVnoiiXV!8ZJ< zSo)nFdKPoT42#KCF($lS1e!xX+Q0bU;UA;?3*i)b@96e@f15v+&(vK1#BisickSbt zVrt~j0s!5gLBSy_*-$Pj62EaLN+gWEOYE~U=v=8}sRt~Ltod@sT>^q-7T$GCnwJr% zV`86XRVAkK9Lx&?VL1&7{C@CGSXoFW>l=VxDh4D?+|LPJpDG9K--lNwo?Ed_H2eEOTk?$y$Zr^vQ`1AM3iJ3|8o#}qI&{IQR zVJcPGG;?fU%6rSp^S?-Md^PTX$o!eRHEQ#g&G$&O<2j^Y_6!Co`kO_9OpTpPh#`S- zMA6SmG1$v%6q_H^X7-8#6XR4mss*QMRs1_|Txv4WVkI3n#2fZR-7-E#%4P{*&B?yL z6D?#&%2bWK!{7?{8351Ry^kXZ*7Puh{7rU1xcp&LAs4N*qphZ;rZzKh&MD-H(=y-_WY6c=D-^wLghEX!*Vy2-XM0L`TEE?9D#A>L9A1C&&X_o%l z<58x+@Al34oFD2R$QXUKC;y{~%Cp`z(AqLh6tks0y(tkMWEnH>|a~%go1UQdj9&vdFF-8n7y@bm;dTl69*(Mm%<|f2v ze)gsd0_!JCGmNlZ9VIox2_r!}088Du`Nr{xU%27gjP*UDlt=duqxf%xZI`<(Qeh=9 zDtKGe)8a5WIXQ0VMv>s^5)Ed5IG2e{U`=n+agk|ckKv4Ud(K7~ABu?kG;ax+dmg}Q zbUQkSqj7F4{|kWUz!sn}-?S`KypP^q!PnDo&l5b|cOahpuy_#p6M&k)skBKbA;wGru$bmlX%1 zGx_)$#>?gPb?xtbC>GUb`?c!+x*2@KJreGi0Tqjg@ zdw$xnmSmN%-H)%FC*Aiv<|jVLuH>PklBJ@S#IcpiEGq`lgmovcoM$wZkXDxC-MxMi zFFfhFWBH|NG_HvQ+F~iLtETr}QMeC1@qG?l@|3=cKR^E2TKYGDNaH(WTZ`hBL+6>r zW{0nq%w~o267?#+Od{e5W;&?KswB7Ev+#oB+t8If!h0*B;HD&-Wy&&~sQ#JUA zU)oXq%X0u05`*!D9GIKD}n2i+w@%vM0 z&~(R30r<6DB2)w@=D!hnvd+fmK2g+i9)NlfAux7z=Hu{{Ti6{+y~3VDVZf%Mnzp^l z_T3>Vq=m#0xzm`o-Ezr*7B;Zv3_I|)F(+xNku-&=agTI_xqtrH-nzV3)ct}SJ9#~t zb#|Q9h86Ccb)IDZ3RW?pOPBjvLj~R8(;!Lm39ce?*)Pw{%1R3DXDoP|<{kK&1D;{7 zTj%TsgDj3havbaUSG+@~ZvW`a47sM}L$-b1%cMT6F?$zxWRpB=09+*dS}9l`9(fF% zI(7*-)PF(M^HchEy}`7Rml9LhuHQ|b>8Ml*h4Rj0wd$2_CYy8FXyONbbbJG`YKx3o zd1=ZpK9g>9dTb64)e!ezPp|9fhj;jnj@SGCxW7nEAFN+B@0iSe{o1$PgX-rlLy10`gJrimdWRtGfF)BY`;yuYC6}w!dM*yhU5OzYG%_%7*rQjf369STz znY|*(m*hm!UkE17kclwfmND1dIGv5De_Z^x@~6+Hs;>s=fbM1;7GuzM(E?7=E+n7J z@${SS{2J};Lnr42ob0asYY4!VZ-tvYsjTR=NxF$6$1veNs`=NaVTTE3&;8XFHC}p{mH>{QPI!tVN<;uFM)TIvNjb39 zt>qXgy6Xp!G84Si0t5mjCuHutiJ|W@wY%JXZ&htMiK{~Srbj16R6QU|PSjb81xkp% zdcUK!oaBXyA)r~#)!y9Nvge_riTk8(F|(iwPE6IYphh9TBJ2Fy=IL9VvJ{WKN7Rh0 zMI76x(m9AEqbhI!<~IRCjC^~w07w%C%HhP~aV}~c1Qo{v8V{e0%*?{s*xE(V{%V`= zDgA-8$P|f<&>l*EZqBN~av~bwU{~SZvlL@)eFHj{1dX(S{aDO@uhUBVk4KM1D@bW< z)QiSi{(ypj9+Q)kyB-{}dhOX1l$DJ!aBD12da{UA8!@_+H62u`eWWB$&{0m2q2gU| zyldKi1olcAs!~|iK@Ll_wzw&aiD^^mBSQo)>cE9$ip7Xd58a_@g7c8ZAjI*Q9aMnW zPZB$A&5FOsPz|L2W2N#4?x|JJu9=Mb9*^x7Idsl1t&1lsCH+FFfO)No0jO?X;Mv^e z6Xy6F9!*x3E*%WYEI!OAGk0L2G1I~wQV3iKpKvIQ$_N5q4_t93DoTmQSj{xE8(P8H zX%HxmOnJ^A>R(}kZJ-HRPb`)!Z){LPyIhb;th@Zkyf2fMonKj@yk2RoX=CY#U2OOx zRkATJ!&zg{6FZrtTOgw6`nR~x-X}0q87LUYgiOUncJU7V$|ZUy$uav^T-Gmm9YTLh z&1zNE@$*09`K=yar+<50o3AMi8h~57-^)860`lg zj$^g~R69UX#5+Whm4<;mihoZyeA(v-jsNMah(sNNj)oAJuB?AZW{Pi%%P>JlFQ+?U zQ`N|?*Wz}3{}*kuf`4B(gnFx&-+h!kPzh2Z>B1klsqq z7eQbROG4wrHP&$QJ&{pJ4S-#0aX3*BvNIqCZS_3GOzCp;UC@wjTwL!lK>Ejzno4H1 z_~^{dc&71@+E0u-wOrynu_tErAY(p$zLsnJHI_}<8k9W9;ZzEN(0$dmSAa}TUxe-S zHVsx#m1a$;%gNk?U?{0qXul+@AsU5e9?5`Z1_ zyK!k?Xzlw2fvYq>d>B$4cP5*$90Gfv8`)$zN0l{elN3NAoL#IM=FhiE}&jr zyUtc2EWxU~NF+ZPO*1(m=}rX&4NU^<0Tsu3J$fr6>o~ zCyze04n_7dTeVCyeqD@UaqULiaKS^fra)W^gKS57tt z`sMBIEjHnB6s6Jpr`EgpYf=bXbEOP5#{ji7NLTveAOPv^Vzsu6eziKq zn%tsB>7#30aGWy#p%KOzmfedAv*cOdsi8hFPR-y~KE&pVmcbv7MpgdZ#mmU19BLuCLFd=y)4Ag7W^$?eWp|aQsK>1t|9MP!I&rO&tyIbpG2E zr;?6=y1Rl|au|Z!V50{*X2r1bIgU?3>TRQl%~bnmP+!&avnyDX{m+lOMMmyDyqE70 ze%Ts7p+pG-NLU(vw@9=jcSHaKJ7ffFPOCPw(R!+R@Wn8#^s6D&Jb1 zK3H9xI$C#vo^2Wl(?TmOKdZn7DVA4`GU)&oTD))t#VM^p(hrWFW{npkdGQS_l3wsz zV<~sJUta+7e3n^4KQlb16wL*NC&ce;UYF6=o^AJwOFTfuF#SDls12AkucDik79u_X zvXINT_tAMb|5v33W!VicmAhU`p1y`rXW$5&VP8juMERgxqaZ^yi1E3SA$5vkMBJS3 zwem<#PW0g;!Ruz&c~ShIbDQ(>)-Fx1-!X_I)xFvfWBvX=?~+^iHm@W1w)$qmh2nuh zZ5%1Wt&Wphl#*BSdw@_3H0&&FI>%C}FtFZ9Hz` z#$6u(i+KpKS7L1_&Id~N^8HRc$m5)R&=6}yS}q4>2+Y{x}N*icXEugJu!{!u&{YeRjxa^kaTnnQE?ULa#o?&C54lS@nv+qocWG~JOf|AISPE* z)s=lmJuU$O#@=Hxs@*w7pHx=d+%-X8yJf?>Dmv~sqjUtuouLeq!2T8iPB%@R$UVRK z5d}tMJqByP%zGma|39N;6%(@c^AOqn&3aTxu01&kOg*k9r19@*;Xr}NSszEB^s*My z$6zXlf0}Y2H$3JG0y;^s%1`aCVltdzqsJ=rp1REgo!56T4a01dkrRjsxQngG6aS?z_n}Oi;W^Dd-V4?7B$7r)~S6 zCl4E&DWT^ZoykUvMl2f~0Ay9op{Sp;33gqKi=LKN+S#?^ zh=I)D88jxcN|nUHgR`60N*G{gMI$EE;Y{~4ZSAa!23{Zm-mG=l5axtDRxR#>*e_I6 z!cavIr)_p26^NCRF*R}-+&$%Up4v5Yu5c_we$`1Z)i<}#+4o4M*Jng@(Zf+%BpYIxZ zywZ|r{Ed*>^5uY#BBL%~KjZS^qDfUp=L~&{W;28raPj2)*)4YB$|3jx2OC$1Uy%$p zzQ@=1@IM}d^TDe>cY?NIl~6e*Z73}uj;_)?pkYwTt7^&`ZWnm-7~&I%dB}@!e%SPg zPF#h+>=D3h-5y-2Va^k@FHy`7>_D+ct!Vjc{}N8XOnQ%hZfm!c$#1yXo?zZyOKZxT z*8>qj6s?H;6&p`ndk94)VZBgzrB2&QR^EHq5V>qxXs9&xJK;MA^J3)FU#}7O%`57* z2Bv=&BbrUlIXD7NhA~4&jv7@Oc_p8RhD!8UK_^V@8Wd_Gy4cBw3hcQd6Al=Ajh*an z?9|-}fi4u~IMv6S=)BCMN|Z&BW!5#wpb*)Zm64w&5jotnt~*K~ZQbzk*K^pWqTfqD z6VlRfQ zE8hOfP8>(a$I>$dQ3qy*xDqw^2dWhwQ=3wK|36bFiy+=_ejzoHyqf=8c=BrggHVdL zEHvI(>%$E92v_xJWR-~)ot4zMv$a%Gau1NSxL6`*_L*n>Q`Go`G0TBPK24>vqPAqB zBC>lH-5HjeifZSa?p$0A)y*3*t$+_l#Sh zonXPSf}h2bF}W~QVzZ@FTy}A^>D~0s8n!(gqM&AGo66NJyNuWf6$3;H3^~8-*XCjR zLjD~JeaL`#*-RKxP4QgHdB>IrRcS&?@+K>uZ!xX7 zGaO!P$TniEL91aFz(=!iqmXLu6 zREXPMB^|d@eoAnO4wWkTf-alY3UB(;#No)wf+}l7zljUEoTuDle>pdpL~P&H$rml| z7g_!Oa}{P@o&r}n6;`LQ4)`>fxt5C=%`5^Oi`+^X@kL_&X5=9BreDy15@Us|O2dQ3>!WtdZ%lOY#@f$$t^zp0|hX-4y2 z@}Z1tyKvOOntyM`OhCABHsGOm?O1Yq+=(fp-qD^&`b821X$R3FWm-M@*x-siAU?GvSeGEM-07BbuUxbN81KloGp{1cL zRQuM93MP=hef%^F^1M3K`h^khh^7!yKD^)0se>Bhx#Bd4wh3PcWT{XM$t~0_2j*-@ zg{$Z1qyFOjvly}n%v0uJSq!^ot@5n|?Oyj8U8T!nG_o7;wBCM#>6})W1s~AR@YgiI zKpR)kYxcWy#atf)l%4o$%1SUn@{qSKPR60%RpME9?Dy~Q0qN`WAa2bbDlTeOdIA}x zNk@O)2Pe5moK-aZuPh0$i*>Xd?}iSHHyX_$xx8k-jgT58x+ZJNN^=Vb{_y|JLcLN( zb)$CtEHe3Hoy>X$%LFc!1(Xe^1X{FFsDieiz0AC3l2R@;QFj&IW)%66TOrd}=E`Zv zhzGlUAw5k%12Y9t*~tGxoMg`7Bq?sm_u9`$8FH1=f6gU>Q$w z9Nr883p);abbKsRo4D@m(VVkJK&rGFb&Ifi;582-C>FuLY|j2ARwkhT9ymWKMP}HW z!Y$MVupfe2;4R1@CI}^g2kpZL1CtgOB(W|R#I#ZfhD8OX+dNd(p&dFM!pQLdgJX9)7CChd&u2K zi*#%%_7RynHajZ{J8Bk+HPe=^0*YsrT6E41%hsMBrCUcEI5P6W$`0Jpjtr4JzncQ+ zTr3XS=cS7v?fk}Nri~X7^1nV-o;)0#?8X(~y3*|yBec8?B-A%RDXYNb2x@mh z#pk|fa81n9*FV|HU>qrVb)UNAFERHNpdP+)DArf@i%8JHQ%B(^`p=-jw;l)uS| z>BHxa(1^&$6V0$q&wKi0f-aywOjD^$Nl`04HD7N7;|X<4n5wxeGY)06Z#{tzvFAK5;unLVFA=g&dN>eByD&>(aL`NAf)6IU|re zv0gJNZ>iWrEkRnO=>a%)x1hk?qi~jVLGdyCa6BizRbTczLL_%Fu*3vZ?mt(-}-$fZfb;;SO(zaS$>cayFhI1c;X*x|5O z9Zg1xo!kzC4u3q3couOu$FN6CBK6b@Rc50Jloe zg}3qT*|QkuNhIUr+~H92sR@oQG|NZno>!xNNU)a~GKyNh8RJS!HreeX z%S1b4|F{WkSV01kPnmV4P=( z`R09B1>geT@@aX*6rY4TkI&?d>|G2t8dumarGVw*rR}=`Tc<%yB?hEuMTwcGT*%d+ zhFoRETz`(R^vs6KBacV1q7ad(-eyA+@^vm$CDM{jSbBtSU+OE)Hkan`EM_yMp6sSNEP1F)DSjnj8 zA-{}^rILpK!%uf=fk~o}qD+@ma>bkb`yjp-zrP9**X;5yYPZDQL{hZVAF%YgSNW_ot-y%6%!n9x&204)Y;R>U#^QDn(CX3uN} zTe}HV`88>G3wK@3h+93%3Lf8M4o1W75Yjd49FVi?YJc-(UCnqCf$)C1 zD)@kYT6z@KG4ML#)9IBvVGhQs5ig?|4?tUvOp;Hc#x*H>@puNctTdV7{S^WX8VCmj!9KRRfIzRZ~7t#KQ@>N?2pmgYWg zv7^vPM}g*z5e9(_kLHuq{KxL^X`h+R;!>b1 zC*{k>A@O9m72p*^Nl`cFk6Kfz_7)>)Lv@dEi+(Gc!N@CmH(qQl3PFvsYP*wgD0qcv z3J3@Yl0oYwY*$hw7W@ka;4X421|GWzltZRPLud&p=Jx>=OL-Hn?-B=Oy~3U zo>G@bpVo*GO`yyQ&AirMEe)Sz09246;QkOi!oj%HBP;f~sC| zdpH)OY(ZZ>d0an<_gb6b>x=9EjFw7d{g0o~`}aKbHhitBQ>T}0+mf^wc67=x3BO2$smG9RQm{m6$1uWES69grjL0tE?(_CqFeu<^Uw!h0 zy~*zH`#T$f&%Eu@`We;z`|goKP=w)|-fi$lX8T7FP9LS@iRe4S4eIBO)R)v&+g?uf zZAH@eERq3jLy8Ff<}qS_f#mo6o87zPwnap}Rx12=V1L5SpgcYL@lvY9(pPPDCBp>< zG(tT8^Z}$w8m>=rq(G3zag^MFw^T^oXU>Jl)H$E@FR5XNbIIE`zW=CXAyl%CGnWIY z=sRofNT)h(P3GdcKpIU9pqPT5--N6xAfCj>9w;A!P%Q8woP7S|aT)I?t?r^>H5HsB$_C!r*qwwCGd<&m7$#ZzWJPLu&(mK(a@wrfcI9t}j= zFojFrd;~m>0Z7DGEmvFZPV7A&se0xeJnUdtK(%%0Az?wvyWc+Mg{^6KVt_xQD#FHO z#(rjI6f%B1rK*WP3T;&hme(YL{50I$20o%XT%&2I0LH(AYbgYQFtd=puAL3{SE>gI=m6#ZX-|<%lz1WX(?+ysLz(C5S@U6{xK)#GB5YI=*AaXr z@R9}+%N~r;4jWp1`}Rl9Y>9>{=|r6}1P>33uvBbs>bv(*R7$fC0PdmzIP;SDY3xeh zuD8owV>^ciL86|I$|@Tx9~1fb)#O$9 zn-OfI<|ioqo}Y+2fLITzB88L(3EY?{2*+e0wLp}gNg#w@egXxwf*1r=KkU*Vi;Q($ zI$D}(kw7U=GA!u7=jM(hOK;{{tonCjEAjU_ClII$&Xol%8~>79ag3_B+x} z(+TF;7H7SNeo-Go?TP^q13?wdQ}7&Xw2L_V=dYf@GYcpM2M0HszI`hQtxezqMW+}o z5PKT@yzX@AN<5Ay>$|;`TVBQbyPBVni>@9JYi=ZvpcD`~ z6cY=yr`Q^K^h#-0bg{`A{%6~blmquBi5(K#AGtVfo0>0Q@62DqeXj#XMY&fat0(I{ zZxU4*4^$a?r&be}x5L#BfQ{+g0zskBeS%;V^wd7%R0$@MX-6laKD%61g282D4UOjh zK+cUGk8J)nB%8wgh1}EI^_3NcsZ>Vh@q0$S&S}Yj`l3(Lqjao+e+zIX9Z*RwMDyq) z9etbrxS4x@TkE6B0x7Df)#Zc&MX0+%&aB&QzMN6TEXFJE+$y6gtEg=;^(%)H?%P-8i06sAQwbAb+yd(2wIQZt{$27sRGXiGP@ZoWyt`Dp8B z8KJG6^8T|@6$Z3yEc6-ZVFU3-pKbSP(>NhIm-nlVlW!A>M`N*s3Qt#Zio%#Fu741> zz)F?4S4h{(n5{NlT_I0Hvcx}pV;hOh+cPsW4ZzZYH${ zxW9sj5u~gh@Y}DLOr%}#_gsh2&7Aa$#1}_q$ zrreEc=}J@ts8#+*c%1}K3I1aPV)8r7aWqUHgY*rg)3eZsw#k)LOR9tai5^?u92RM( z#UrM!i{4kOCT#ISRW}cAq2M3MWlORcuwj>(#fN1Ki5~TcVS!>EjN+}3)uQVd2|o~@ zR+eC0m>b#u96XQW<(Jml!-YxrlDm9f$p%xvwvg6+$z+bPsu-vhafW>6MuI^U!Jko= zn3$Lj$g-v59ZaSX(j{Sg6JU4sdeSa7*|vo0f6kDc4Us_AV6gpBje~5)-$pXI#NYw7 zVnr=9G>ofc#^FJ=2!QWl6<|w77^Dr~PulSG*^Sa=R=)$Ehu8q)3S`6il^9QAu@nx0 zDoAhN2h4M9HE%m%ms!V|?PFf$D+PcZ0^ocZY9#NVLL{44?LD9;RV~Wxa7j6gXd|3W zOs;oH5ZZb_wzg?%`$i6Q1^%UWEV3dYLYPVOEeBU=<1;grNc^kJ!6oiL`>8ZqM#Oyl zV58@hs71OC*yEsq>b&JGB{iqCNE;{%)fQk1$!;nas)bzL`(V@g|AiVeiU>n#BMkAE z>w_oa;TOy;r=~_MOLcOQHUS;cxYu9QgH?UQV$=D7Fe*np)CC%RP9Fg?GPJtY7~!@N zFehdf?qPI=3yn-R1~%#%;i;-W=AL+g=^cV3Yb45qZW}z=JG#@GN#mJIM5Bov&+x%L#@d&{e)M2veI#*x!Aa$&bdB5!~Z zvHFHs6D&KkxO9|?9GN9yv@VV5oIRKHTumcDgiLryA3`(#r$U9V0}t~C=5X#;;i|b< z0Q-`0*Q~|cKUxXORB+y5i^u5V|8ifOAH966W}Wnn`>!J%EK zvMSO5OM-N>Rq1MI?3p9v`hR!qBvjs85woHokgpUws9gnMKsE!1JPIB@$tx==p2lZk z(Xx}6D%o>4q|yUnl-oOi?*{6`H6=fCEg*$_*H$sZFul~0+9lwiZ0;FOI z3xHy3(#N1d)WU*R0nxhwtFuUo5eF`4)@o#pq@)DwY;5w3GmHfi^(XWT1TkR^IKp=G z&NMa#_7RAPp$4Wp!T+N5G&T{oX>eyj-&ZvS|I02xD1<>%Nm6T@(fkRvVo*ms=ycql zgKq%AcGXgR5-HRXFs8M_RREZX+|ZDi@!CHkbAX0FKW^VregqOtyhgc%B$FiXCo8}x z(Z3}6@RuHt#}o|cK#x<-$Hbh#D=4|^BBcbAdDYO+koT*6jYbUfoxNrSrb)k?hg}X^ zmCseVueSQ)G;4J)-H{&j1Eu5BM!UsdBb2kie&HW4_^@&bN+LcYVnj-+TFj%NpunJ< zfP=E8>8V`!I5~aqZv_N-#QgVncVN0S-+&vwhwb4nx8rv(?9}P_Dd6VDNY=t+fBx6(2snyTa7X4(Z8GL;}-0Gw=4QH^P_DW7kW-w;9d9e!VAA>E*C|HNsd8PrKP>! z_jygudQg7SAt9iP<$lEzb{YG7;@>Lw&wgDDcH_?@{6{KWd(Pfk^6gjQtM~7hzk4Uw z%d+?)hv^mbODA3wv;ptBKM0&Rn8&a9{lnpj;VipFE>5eEWqI+VR`hsD?H^8BdMv3wHfqG}B>Z{e>m zpNM{(Dg4vtd_c&`=qRmEjx0+eUHr!J^ z#sA&w|9n>KLf@yK=YY!!6&sCX-Y$6`miH$oweEjDb^c}G5XY1XiRmnhn<{SIw$98d zYGP}Znj^A3OY2C@EG5a$+&}&T7Ye<3E%ZI=6gSum5v>oYz|lahcXhY!d_M$?f?2bo zqUx_+{blleV&c{t*Dv1%uDCmX%q=sd=j6#qyOq;5&&{)S1}^{Ly8Sma#v7cM7e3sa zw4g9=LHL8qyXQ?h$aj0&-pFZg-mYzv?pwtzV?CgA>)JKF+Q!Ys#wNzb-oS+*K}!|$ z&%HH$vErua$&%ks%5IyzjYy3SVzfGWIDHS>Hm%^&6-uqPMy+PwRZLAGt2xYncSI_w#w6VtA6S0B_}Ry>%VgD>&jY%q^lvX?f0La z?Dxa&_1a(arsf{Yew?S0bidp(!OYHkZ#!S0PtAWt3#DU!ceH`5KIWu)aE8J`*+=jE zk7gKt-(UBs^w<0L{hsFcHcY*?E>`{YE6hE{aj3ZKRC(EV&Uf$ zy5pCpR6KpBeCG@M%6E}fsps`GZeKIM2s{TRwVlP-!)-A?_r-~x&WTz6idRZp#8qU~ zc_rHfVsF?T=T!8PmW-2gD4qUTz3(*BgUp7a^!LY1gFCK+hNvZ;Iy9XJ8n5-vPU)E2 zZNrSP-%o>3-YKubZsm_~&f=#j2aK zeZdKTHtw?*fGrJQU;oo_?Z6#%n{K;KYbbqi_>q*P{*&8DV86IDJ#J!ouWY{Sy?2ty za%(wZja{db4fMQwIzEag{Ry?38V89xWk;V9eom!7z)rrfVO@BSmYs3F#+i?7`pJcfyOZ+O|jHH(1+52!VD zFu?$1Gl&85HIM;HCk7IrtO$|>S_NW&3NRo8RG-jUQq94R71Mcm-A;<6hS)!OtFtr0 T4@|l$$p8eNu6{1-oD!M6cPuwR%$IxCpUm6+`HMjFSlLkMJ0uzs#-ih>3~0*|4(%37T;X4qDg5#MX>G zV1&oXaYQUyybdE?VNCN zC)5Fo5}p*)xdW2cLVWIC|FT2(Q<8>O;w-yRO*A`y7_7i5;5N-DLE{=FFGLr{`5w+V zD(0M55AQn8b+4YaD^%Fs-j*B%N)Ag+s&6jq8qRQAk_48_DvD5vRJQH>r~j%8pU`_- zq$_(klyX7uv$2ZEFVQy9poyfy%0))eC^vs9@6Wf8-7;7uEccWga2z4&;c9=D!defza635HxF+RvH+OYNh-f{A z7j+k?%UBz-v=Z21*AF*EQ5_1ysf^BC&IxwVLfSbv1^|P3_|)84rs$ZX7~EbQF2b|z zcd+}Ph~l+Q5?<2#;cbU^bbaK9gwxDKl*V*%;6I`{*#6_LSw_zLmjR>{HOJX6uT?Lt zp)1W?0G<1B=5ko>7$DD%mlo+ZUg22~IaGuhKQNv9Y5c~kIh#hUC;+#Uw-K%o_wXof z5?PX4I`c}mdXIkiZhA{fxtQElHAjZGSU~Vq?1s-Yira1Ec&Yck;m>qBdspfCu+$S} zagG0N)Js}M$#I(oS~^xJn1?csX)G{GLHz#lzT~R|-L}<+M`+BRVuUaZ`whg@$qU zh01=~sBiwPyKP++;KT$?HO=zh6)c|SsHev}e|LL68VIvl^iFTiY-Lj_o%#51{%dtP z?XuD}zK1$-#3~-mZ7a$YmK53nXBNQPf}FpeQGI=qDtI!r191B%4c~AtgJmxt5S->X zd>g8<*9vU*QTw~6oQNViZbm>IjKm>Q^92VZONReLntUD)PFhhcT*t%sm7=S!FEBehi_)9Vi5vn1 zdB+e$APsDBWn^V3%F`x%hCSC-+vMzeT@s?iH$RYbIuciiHqKu<&fcf)j? zF_WSOm=@*ERKxQ7#0+_xJ4O{#RaK+f4Mkg~uWz#!_ib_tx_?|dUm{Gr(vDK&w+Hyo z>Z8DakRqh9CK)oi?+p(9k{W{aZ8zoBkSvmt$%XR2 z5x8#N_N=#Ov~H5L^nG8bFxu1H7R}Xzs_D$B5|wTBiOVz`uym;xMHa}6S=^jpkc+uB zr+pAtN#D_UEDGF7@~oTsKtc(1z0%dtYRUhM6oy<3xw*_~_K1uHEBE?^sg|@6HHq)Gd2(2tbg(p-4nUP!X!;nPAI!<{Bgn%c)ixY zW=!mx`V8pi5He{%mg?`bO%D%+ym%alO!wWoE{khk4)Ml2>AT+kwEhD?ULoS>*n{#= z#BO89)BgNmG6YEDJK->^@XR6?XYK1rb>Ug7#&~1884E9(7YwAVjLevaSl8qRs#Doy zJO7jd$7w_$zLISO6ahCXGZh_jHIh~R1}@4U3v4E8A`{%aYGoh7F1%qWDDoyn<3~VY zkqaedKfTX3nRz2_8Kixa$%HIb2; zH>8_F!^V=Xzf~NJlP$dRBLH-m_~3|dr{PVrDAMrb>wPkn!X*AQdv_LKGj-PN3EzBp zSQHk&Q^4X>xX2_iexFtV7bAOppRi34-itXtUIEMH18h9^i-d_WHE0t>of340pP5_j zk1yQS!=3~(YK{bX;KC_HfvS8?Ufz4((QPRzTSEyQB`E3eMKqE(fq6`iUN#&?cEo9vgN?UvdhnU?pm@wMw6n{d;W>4-dUp zn|G!l3H+$*$D~2O4Y(`FSVk-pYs`IYaBOyc9v|eoe@%6IdhE1&4vS^K=_GlN6nQIQ zbo!h)wF7_LZf@4_w>ooZuA)Dk$yuIXX*8IG*Q+2>7yeWk+*hjKe4@R@aU_I2&=+17 zuKEng-9Y$0{ex*am^8>4d49BO#Fnk=qu(lR>Dv|()4G129V11}tKAGCou=l4w4*-y zDST=Cs%W_X<7&3?X&@o>{9WJvayh&eTH><*ktp|tG5hS1O`mW!_Oi?IQyn2uJfYq_N|iqp@k%Nc7{Gl}8-v z)q{HZ8NQ>K#^m1T@iYR-QJ=J33B5i>dD^x(=Jip@|8g317ZN}R#cCECH>O%AFQtp~ z{!!Co&`m;;e}3i|>(A42fx(cnF~}mkzOr70J1`(X>=yS%Nt>ubjNbnfaUs^r*VUq? z?jsO2Ui^?uetiB_c;C)`z?9-oMkYoEym)k^2&*h`YX1DZUfW?<=AlIH%Scsc=RTat zfdZ^XBDCjp9;m_nSl`zNo3#{E0k!h*!Y&%ehI*^q+U@vn;eQbUm3?278F=IF#MG=T z3Y^VR&mUx(uCey+<&;!UEb552#rIzGZ&VVibtTzYbIlF43@S^N!F6kg+}dDW4O?{+ce-37G}=tHSYSL5eU~ zu*t}c?woGoX3q;Z1QidUeeD)p{w6IE6<>qMni9!@nW*Jf$|iIJ`+h!{3g)cY1rftY zjZKYHcTNj-5&>6CxG`~Y;4$dq$F9_<42}(_C56D7n^Xd$_CVN9CLJccs5ngAGhmbj znl+A+!S*Uq3G8NF?oKq*vZbV=dtxeY+jTB`-O=E_0^7TbYf>HH{+S?0l4ha{5L zp7^gFcu!wtGH$SJQ(3HdKVVO1)X+MOy!)#r@BF46YB1tZ4fyfls3u(pkna^Y`cM8a z4dc4ae-~M;ZgwuUx#?o;LqB*4{#5v5kW2EirW^bdS!d#5=3z9yLtyVd_`3fe8!;2Q4eURb(yPDe0Bn7ll_tcNJj5;hNV zoE2S4mYw%kZ_4S1hr)23&qy!W%C`3nJoo<|1Qr7|J+F{wTPug(KYW{bQ3F;r<@7JQ zg%zR>@LfppR=azQ!Vl$ZDqgo7;CDPVL@Bi*wz81NT}c6gOI zl*b^sOvgbzo)>=$yl_oJHL2k^#*IH0%T8SGUgkSK=pP|e8P5`WMHh$RP$@%rhwI7< zE?=u=em&45&Qxt`wv3+Nqq^sp8WbLCluW}OZzG-<^0$k|It`!vtv|yjoB^EZ7RTF$ zeObQ@_wAdO?tUoTl9lDkxz=k>J+8;A?S=|xac4_W)^CfI=r7(Gk6C^2SC5V-75Wz% zG}aZ&bKS3b&T$be@NgiPDQ%wwI}Q!rFm_0Lr0EP-K&jskDyP{j4$qaqoIz(s`j#ul zqiez`Vwf=@Lj({9_)~!p9tblsjjRZ=k?_iC9<11=@k4#bhl{PtW%1A0$*i4!99jRFy1Ezp3pjf8dky)zkT8 z+x!oxT<{K6tiG7Kz?0a z1OiObQ-T*jr%GD-3zHZ~y?1ky)t*h}K@ysnRz8dZhY_bdnHtym??$pMI47C?^y|H* zY5S~gq=1=;q)X);Qs%b(_Xuu)3y}Xrn)9_SxZ?f3-PpAvearRkjXJomuyVhn%a?W^ z+0!@R+OP9Mqq6RX(9%Z9A#D^f-@2OgeP=N0Qs%T?hhl&9JOtvp{o->i7XMrCuS9~X z;vw1y$IqS@>BaPJBwz=F^^+!NatumPYeO$IK}lAT`kw_m;OBi@T-;}EOU$uc5$Mc{ z9}EQsgIjZwWs&`)o8LWb-kUJ3wHWdc816s@XiWR_FFm-OZa80|E`7Djk*ItM)I*Sb zsyi(KRw65I=MYiOKlkfZb*(6XK#$v{PGvPB!s6eSy-NyFpKlvj*j7=3hcU34@qVU} z(pJ@FmUZ>0Y+IJG!9CVg(j>R`p^DdHkzVzGiFh_?RZr4q#1`Uzmp7E-N&PrtoXHdh zGhC{bgg4y#bcR{hl*n^~t>sbT3C$Q#4DzMzq!+IctV|_E($aR$7qsrPgoyl^TC(_J z0Q;?)<*CNa)4r>SLGbO zt|;q%fm!H_ig(vU_JTAe6r-vubb^fUg9P!`sI^Czg6|K$Xw<_CF4PcJ1f>;}C~ex` z1zQmWTm+Y8o9wa<^c!d1^dXi@j=MTF!8wfp;Jr=z32qjSg@N4mr~om8$3m+ zz~Eqr1E&`p+BE7g(lIZ~i3h&doqIn*naoSG5(fKkRBJG|4F3Bf?gN09iNb1Buqb#q zADmf&c8H%zkFoF{*NH>1YC-1o7Co}eb@@MVXpMm6)C0|4&Ke~9c?P;RT{>5)ZIM=d z9?tQ}iYP|Drv=mA!9H|&fhw2uPjuWX+32QC($lo7jj|hOYrnSRV^$d!Zb{J|U<|Mf zaCG{RNlH~ZHTAhqYWS`8>)R9&W&#K#6F;*mVc)7vB1y~0$Y26Kvu%BNH(p>w}9^>zF_E??gvW8Ld-C-(Y`9auG$3~=m@<=SIL$o!uatvt=orvUAHUw!Oe}YX?OCW& z-6(ZG@XM8!2OWxJ8r-&I4+m08kss?BH$S^7zg_Oh#odxVi26+W=`IT0NdUPc{EJ%h zFaC}j1Uss-mtS>aCzkTxLvO-#G&pCZ2#gN9kU73^dji~$|4T#3OG`_O4+1=|A75I_ zgb7k%N$~SqKM^2(*XB+@t3?0<6NAmzyCV*6eRjof-a`p7;&ifb9d5zRcc@(nUyS!h zWiXA}`{{kg@A8t-4;yvqr74QyViHXowD>Y9X9cWp>LlKh76>Yf1c7Q}d=*xhzs@P^ z&hcG|-Ds#!uCGhkQIGwyc>5uxCP?46nc}*Fc_W4G>JiZ!g z3}5#Ip|Yr1pe17}9{TjRE9G}_CNh)A&t*p@z25^q)*Hh|_+Se|j1%;D+u=nG{OQsPUE#xqz)e1_F zz~bpC!#Ded7qI94nC8!)5Rf~9r1GSxX^)Vm9DRWJ70o)LE)vka4o`RAXnQhq9Gk-| zs3cHxP(1I7YzPX!*->&XRhm%Ms%_H~_hNkai_P{YGe;5Ji7WK%!m}UUz>FNRryIcTX-A!@VcH(BfCgX1}q(uzSbZ$v^w7&)}0fUAO<|j94 zSM@*HbF(N9z5czrJis9D`9ijGD|q6j{f8%=V48N~ITMqFyv}57+vVoqk-rcbA)~e& zjze7wQt=W*+1Z#G{&r*hvo=o%hKia7ks%#Mt}%g-b5bJ(nYBMe?t1EKPnSqAD@~gb3vMgsxfmh<0y8hkeV2 zUntQf{j*|0(@BLX6F^gyGslTN^1cqw?uVKDMgcJ`%P-E8FIQ$i51OWIu~Fg>Ur&cT z6nMavHtwUD&aZ5NnBa(>@Ic!{54o;F?|9L1%Yy7r_LjA0930lRe>(P`{= zntmWdR%#6If-ut$jA)TFbxybu%)D#KFOPqJ`=QittpZ^maKd-$6%U=B5VA~Q03Lrf z+$%+T+PL7y{Htw$7u>X-E9{M@a-ys-qMlCl&tyb-a0wV{oHaiml?2h~L#4FIE6;Ii z!-C0YBZV#yaY_!6kHL!Blm?k9g6fcx27^`0gpKvB?lQbE>FqeLDHlKojARfay0Iy1 z6qgU(mda4|oQhegE=bw4208aZ{$u<+^06n_&`73IuexXfB(BcvisIN}Z`Tnp)&AbJ0eJyQdo#_N=MjY_n`bL<)_t9R)Mja;ZMNVCCV7@8oAp(?d! z8(yQd$*VNavC)i-#nTngSc03ua;a@_!rpV4VzFI9QvDWbL&?V*^92|P{HN<7HceVM+#zP0Q9i9&mAF@Z$yylV0$C#xTcc${+$FCD~V zRxT=kCI;^0q>y@8rmC2M1uw~1YVp{ z3|%bq&$9fMK$d|3nhNE^RSFvAhm~Q8c?CnGh2+=34R^XzA-+_86F0Fc)8=(=(@%3V z+#}2kV_CbS`f0IhGCU!#aVR#-ccYFf>DClU%Y;8zHki7J_j^j?t>Vkds}lkUFp!Tm za>Z{~{9oN(`~rt2Sl2PX%|itM@m>Yyv}omI!#ZZc<=;gH9=Z{el^%c-1R2dR@2@o@N||`aeMmI5VhAJ#bVyBS7%0c!^dOm4$@Fc^A3)vlH_IrWJ#L$)!M9ES|7ba(kZJpkwO%CfDux9vNLK4Q?|c4|@D(Jl&rf66rtdZ!_K&Vmx8 z*MywTHKZ;i?QOk@TG<eBZ3Y4!;=X(5>Q)Z30rf73nayafdvKG< zUzj}|ZcJ{}WC^288R{KnB(8Fh^;Yk_ zuSm(C1ek3Qg%VCZ#46yN1w7wPPfkv%Qj8+n#u9j3? z>bOY}fwmv9d5?^wPdiZ=07Q4-P0SN2oX<|iQGfp&Sb^yLxRSqt%)?Nw$)HFf$+tpm zjetHPPRKhI)r+7KfaG9oV<5pcoma&AOjP5z zGl2^R!ywl8+6F`?#vo(_&qIwf0CmxhKzeTGM#-<^ks0ySbZ~0%*rJj+A>TG(>efKr z&eCY;eYoHK>EqZhOcFaYMV;fi4`1Zd*yZw%@G2W`r~4>ybVqdS2qIe8c1V&F*Tvbn zmWF(V%s`OWxJ&|4q*6N7=(i-Gp`=i4nS63-0{{ev7T~Z=y6|}qud&PKhK7r4+d->R zcVP}Kb1NpsB90b`hTx+i+|ModM0VM37*A9^!C!jg2RYraN;Ir&-XY+COFHxHql1{ILX-oX46JZEq!k z=}Guq#ff@gOI5kz9|n9%){Y*(Kv^jTB~c)i*%riE!II1GLLUjq3{<5v+tVb56wk%5 zxt_iJs|46fZoERMcm@g`P1oCO&P6^7nAWFj1xwB+*ytijOKEWaRrTJy$G;1YAu{v6 z=b}ghQWHdxwj%YiekjPa2mLE2x%nGK0l-y z8XV;By!kioSJSb@I)*V+Y+!M0-G#6x`~_W9%TS-Kkjv>KvR@9vcVk4MXJ{V+^^V$1 zTDe?MaJ_cqX6?3DsA41+O9kond+R@0yvQ*Td@Qn(c;vFIO&pf~3l^YqnzX&hVzrC* z_uCw$99qtcyV!ukq3U`R-x$W5v~KEXxf+5Y9PuJH(@Hxw6~!A0^YXFKd7Hsjv8E3O z`?6I3Ne3ij-by|3pnZXyr-QS2DIcEdUL7TeK>Z}IVb-#%720v%Bl4Jc+BY9Lz6tn= zu8WB-!l2F2_18bKO|kZZNck|MapBg*a0A)Gy8O>!|8-9eTlWQp$pdV3`OXnFH@xSk zhWN#GEIE~ufe8COH2|lL#k#_q@tkJ52Pbha+$Rgh6T_}?p|eUT1?fRt$HkW0y+?zW zP9ZJ6J*91lF-}C)=wyjH8d1rY{(GkV&!W@P*Rd4z=T{z9w-T=K(r>-QMks}S(_Vm~ zY~;7za|b3CgUXDHrT^iE3^6@4T-SPSS~;3on%e*u`j}tV*1l<;*)vsST>}5>K^H|1L#2{~sgy6A%X*%xek-XM+qShfjg!Jy zc-Id$!=EXk!@&R^^aO*p@G4=2Uj)u@StyR*t+W25BmPhIAvLOMd8uem;;q+J6L?un zB5t5-yzAuTR5&v1ZPF#7W1@2lynas@guo3q^@We5Vf_Stz{<$y0CTzFg)Wrw*m4G{ zd9dB)NN9+d`f~Abaa}sS@H;N2n}INAAAG|fyI>+Kk8szQ{!0;!9O2gFz*6-j=f@8w z&kfODx~HuvQ#u|`I)8m09P?CG%kLMOeD6JMRrDMV;OC^JOOZ-mgW2Movm*Kg09 zu>1?EA=VZ8Lgfv!0QYfG>I5z?EUY};@Mx@g&0q^SIGvsnMJeod%Ln5rsw!SCX9&BU z5$x{Dj#yAztApRsM#(Z3>rrb5t4RRT;D}de>e_Qcc!o%Xn5hGP|axJXfWxF&! z)$#N4E_&~sq(e8aV=ueTD{Q-Yf!!bJlb(iaj1?%}EO1@RLP3!WbYlHLnf!SH7On?7 zF5xR=*Nf9lMeq@@jN6Qe2fM^689>#S}-LBA6LR z#5xbU-g6+poz1@Bz_y2C@g2y>I3;rL z+WldNhx9NV1SD0i`rWhJ2&dt$8}yoUJ+9`=gi5XkA<^3H<@p)Z8{47lkU9is!Dr?TqM1&y_hf#TYi0zD;{EnPsJmm;%`lA^)S-9ZP{0Z zn?+*r#y`Hs>TJoWs01YlzmAsiQ8(-msA0uA6A}Mi~*HDC7^Z2|u9u^Kl4&MfOKo`?Q8}98lkg?w0$+cP+tdC$$Ar zV#>EJJhPv2G)`ca?tOcM%dLM!)xG5@z=CnI;tK_1oPh*xESN}dhI(p2267{+RZ!Y$ z0}lXPNm>bqOtVF$KSJqMN%(u+{k}B3W~Y4s=P)ugafQ}wtvl|2 zHvI;n8}RVBaZkQcrMf?mT1WJPx%t1~QK^zs9HC#9QzS?D+5PysV4vb$)?~DRaINS* z=UoQBvCbe3(5oi!Lm#%5h`Tm>6~)X>@{DoSR!qcf!*<<+2_SKRkFCb797riDbnYSS|V?s5cF{{98}{ zbQ>zQ?T43FC86=($%M5Q*xmc5d1huGk^Mog7b`4N;B(OdMpN^?c!s9150lB~`Mp0N ztwl6~$qmT_)oRqUpG5$RuIFEA}i%1dIzNMmWS+=2Z5tn-+{Qj#h;e;uens)EBQ6z zTx86}if$=4Jri~3xF~ndtCk$T-N94gFZ}ejAFKxhj^E@~vzM2LihQ$U;7_^J>6L#6 z_0nGIBhGd}J(B_VG$;o874fU9<_HV}(4F^%#-W%K% z?wRuJch9prQHnh(pEeP*7%=)F4DMZ+HKB2XG@|vN9Q#H5R|MfC*m{aK7QKz_j~$_u zmjx}(hU|0f;?d@-%fMYf;`3j=-x(1t`z_odeiH?)F96_I#jFkELl3kV5(IP6D?0f5D^7wR2i(FzSwO0>$rINmv39?|9gfKQ@(QXyi_chLT}R}E-#nmqKHSM6&-rx9Hl2f#BFD7(Df6VnQ~)d=_d-5 zr{}s9bNWBZ=C?&df1XUa0K+6Wx38wf^p+93ezpHKto$XTuDrEE(QG4|Gh*PRKT=G& z+_IF8(jgkW4!C%Sh(-xrAH9D>>@uXYlV&3ps$U03K0}d$nR!-CYnNugZ>N@AVbIpY zRon71KskG)K#N#L+Zmm&FhtAQG-Y#FJi*ALJX(aG5o;h3OIm?cv~@(v-W z6{01jHOwnEBKDsN)VqSBICHlvcqU^t+;S!WZ<`Xi94RiHihkxKkPwOS%NksmXG42? z+j3=aNI}0Dm5G0T9+gt{5pDwSP(5)R_*H47<;pu+&%j}CP zvs?=prYpkuPkMB3E;dI2VkgNpPXkKwIls@{JR4C-)g=zb>Q>xe_Z&>0|7}8BPZRo< zsfrp#;-LPSU)L#^2L#dgs7f1@d->ODurC9o51mg&FNAQ*U+UYJf;xNuKt(GVq}c2zZDN_{SxJ*@0e$S4{RQVRZxU zwmG@30J=OP0vbfXRC5%bqq`YJA!X+&&&hWZ@9`vW;f^Q(D59QL{C)h_N;P}rb(wiC zxzxuX?KhT~FDQ$J(~5moaqov(q&49iU)u@T*vy%T7br|vv|Ii~#_>((JA~kWN#_kj z5tcVPS`tnp1Gwly^{iM=V*}(pnWh7}P$}eh3|9a2f`J-x>f>AFUXP?BM9jLH<2yj`-xrU4RgJx&m+pGc0 zhi@IN2`kvE)%)|F2_W*I|Nc4NJs)n5)vxCCr2sc;j~I{vk=C)BG99hqD*=o%UY$eE zb=fQ7V`0yyT)<7#RZxEro_=Q;K=Si$H29AIxcgM51RD;b0n7$+tuRXrfiLf<$k0r* zIxF6$*p-;}XU1hZU8;VadD{-0q(z#{vbP?$I=aSV&j>_l4 z1Q8LtvsItj`DOLS#zrEXUkvqrqLfRlG{y(??%7&)h@|rJ@?~If>Ufq|-wNmrCjNUv z473gWJvi}9{~ewjydgLDi~+Fb*@oJ4!|s&9EA#W}AN8w?THW?OYisi$Blbk5cM$pT zcBL%HnAF5c_u%pI^G+4~in6I|noUT3><9F}olRJhaIQ-AcR1t9P?g>n!P4TKGYX{mXJT3eAoS&dbtu z-qF6#<1_g(s0SN8p;&k$KiH8so>{<2#vQLb&JtFfc=pN6fR?Z6RI#1ly{7!H@$9V9}yC@f5?i_ODsr6 z2f^;q8S5bNkVj}=QPp)3J^ ztmG9Gl4wqg)a-Lw@t1U*ZNh4GDg*F(rPhdS{3T4 z8{MHcrV5sanNu-Uu~k7~Y&&q-d3nXJSKhpK&kio+_BnsA@j!sw1%WERkn&pVIYYxn z3qEXY-09JplVnC|mR}(&9IowgP%21K4G-RdJueHu8_Xp!y9`&8&u~_{eXRIcQ!@7H zva+(Gbl~LBJ;Ugqqut2G3_>i+BINj%8;^8TM$t#2`G*ux5`ky0%a1aTVj*TaN+h@R z_4)qKlXBrBOnl`0Y6c6TeYQ*sZ~-#&cj-TOd$zn#Wf?RDJ0m)+G-Z>4OA4TXLZ(D? zIy#v#x8C z<*rlV<;UqL0<@pZN6&~sUA^bG@V(R2KS`RvZojp8xJ?Fa4)_h9K4g}8sQ#*4lE{67 zGPn?>_@F9pQ=*~8nx5RP8Li#%cYR@YE@iBC08RDd`A1~gwD<)?yq_VPEEFk#xUeVr zw&Pg8qNVF3_zQZrm|scRRnKYEYW23)iz`a76yGutpkpB|5cPXkUse60km7tRybHCg zvcCP(9NCdrmaVOJ`7Ju}=+rP0&+F{M*o6ljA)$`3-zN3OES^O=^T5_;J6dXd7E-i7 z{(2uA>>cytKo6GgTeGfDo4C30WWVJOJh^F+sjTr9%jL5Xg6JvjK$Rwg=gSCQ`mPHVNsa9S(MpK2BGoDKQ4_jIyb)DpNlX+O9g1p}au4dlOKbkP`D$a0I5C)* z5J&!S%PT>%(<&-151Q<(tq#D2<>WQ6lwisKy?}{~NRuf?pKUSo!1RwqG6{n80W@@Hy~p2-=;E~`((HjMM-Z6%Xj=ukw}7^2F9kU;1tB*sroMh5sLzxAIb z4HG?bi&_|CSyPF+yy!;qr@QE3&zD{Jlf%vIjK*}1*f~-Ac6*ChUw~`s73N!QNP~dm z1tfNxW^arCGkm>3m5_GZgJf%|QBqJ9kBp$R%$3qA&bSDkuuApt&du==rDr7*daHu? zEgsNT9s}f&f+l3x0i*&05G*H|7F*gmcJZ*OO&VBE8u5P{&$fiyguL9MsvfrG@)~JbjXDz4fh8?!(uLnaC%y+TXn@vg2JNziY+V<|O0Pp5>swI1g&G}8wj>g76 zl(0z!<*>UvO58ZCse?tuoMfWGlAyX`uk2Hh!;>>h&>NrnOn{l*U;P&1HKAKvUH?Pq!1rE3u z;pOMw^CbV5*XbD2ZNjJg4$xr)iHj5+HmGqE>GGW;Z+pEHQ4ww@5Z!o2eJVjhAVT8Qj1dBnk--0yij)I|gtS&_5-!Wt!5f3{2)z^M(1 zlTMRhAAGrAcay04T32y!&&AjDJx^b`^|0dpoZsLL>fM`T$BMQ;vM&oOe%6^ljnDcW ztxb#Wl(+s4$vkJ(eY;8rI;l7zdY!!T4X^isEAlTV+KGOlKCt^2w}hyV%L8941$;vW zcT}2efSDjW8G<{}mi<@Dm?z;k9n(`c;e=7t$R{=nMo9*pcO^>v_*oO0>;nZ{7HZHe znT;eyNtO^F-rfu?8Dq=O;roM?)%h;WvTzucgl8kEs+t*QXg3*OSLzrUaof8 ze||;v-`7_k<-ii$!m=`bGRXYm+&hsAOB}H;3?3c(T1SdT5sX z`n`bs4`=Q@0Px!UI(y-}ga{>qcTb2LH&KhqzkgLo&n_(Sds`I>HJmQrMiW9zc`jTISEs*w*P&Z%2wTwH=Cg*bwMkM;b*vzcez$mayTIO%uPRw5!)ItvvvoIh~h0q0Y@|cuex($6A?U0X? zBvvK#|q#jqMMohhR8fUO=U>jK$`P%kamEov9*S{baN#8S zrDR1vG@wFe)J9?GI5 z03XGcnJ2;L3sh4h6mcZ6E69QYQi6z}NM2D{&LJ4)gNz$^P)LCEwKw$MB``3oF$i8P z--Q6+l#rH#e>r&w7k@B6>~^F3`E;@lV!GZw*Md+}*f?JURrgYp+#}VniO&)xN=0`> z;N9Na+uJ%u`b;wcYl4>@r2Zc_&ghalGfjn8N{uL zgv(pY)6cq&O@zF38@~v(?bo}ntZ*_sd-)M4TVT4Ne->H0bX#;Bft!R-6zSgG7-4KKrG$T zP*ozX;{+`DTF!@O0*f=4hEk)pJU%)4S5KUGQ*nt18{ngP>8JmyH<3aR!l}jg7AYpo z$~QgPfFOkI9yTHz(+h4ZKnG(`_pstT*40yVgvO!HwGhO>d@FwjIKT;ePW&1ahiK#!vubdY8UY zZ#UC8ySln1Jo)rAK60FsM?iE=BYyghg)s!NejccM-tj4=$?)6vJnlvL6?8x?9ybd$M5B z;;JJp?L0)7SvnQJRAm{zj%M~XyDk{tx2Tc#Mxddal)mMp@4;wzcx9bCG5%5=X&`#>FEL$=ca_enrF7TIGX zidyP3|ILRSKZ~d#Zp~ufR6vs<1VqP~Y-lY3R%3HW@P7JuiMG!tATYByT*fPM1qlzz zt*H2D`th^8W<1q~1;!`ij_Bn@`or^cFUn;c^FG7wYYYH8+je2gcB*Q5;M8H0(P|wq zk?N>8bJ%P7RW3S+pxZ1pk$>Op^D8vtMjH*S010g|&LDTKguo%z59xZ@hEw_@;M(Xu zRP!5G94I(@JczTW2~3mVX73wdiTG&FXvPN2{rvYv8l#v#G7Vu8Jd&%Ri@zJ(`jFQJJc2E_~aRuqlk>o;L9S@ zd1uHc>0_O~_T2NAj~ED^e5SuUoPvqXwAa|I8xkYR`ki{EBA3Eis&%20=|(|FOiW3I zCL6!-BEz~r^td|;)pHBekg$2cJdGSg*bM&r8A~a4)X~o-ic@3Gw!w!CAW41v+`5ap zTK#GNI(n=%Z|74e$I>yp?&bUY_y0?f4lL&cv{|CH4L%%pcM~)t*6DLnh zdEISW-5q~JBZCH$OdPV z%-0lzxe%#83x;mrG2VGBYf=<2r`IE;an>2g=RoDJt*xDzLCk$04jBLvprBk!F=Z~V z=FAerd%k|hjcx#7X#w{s0JwO}k3}7jtJzuVyw1)pTC;ksTxbIcI*=U3Kr^JPRbJbW zaK_>p;c$prTUu$wij@@Q!FlZ15&HRSuNK&vpbhJhE;$ z$<$w|b_*9ipMvr8eyT7L$eHj{00Pz?`vDv9II{+Gzoprvd!bJNlYi_b$%<(Ocy<5? zd;kDyyjv`9HWPCY{J#7s1Dt>WfM_ft*CllR29{|nq6J`{z&h3f-cbPX?lb>~dGjdD z!D8ohw0F?_4V!a3r!cFj6j=gvt;-;Kp%?uNI?7`Qi-=_&>a z`BL9a>n_dwu0eoe4uP^jAU_h|cjN##wE%pyhxzQ!2j;CbY?)0QtF#v_=a{S1&tvow8iD!G;iHG8q;S&a&DR#O{fAuCdxNlM9SUS(&_b0(0SYHW zLfSz>7K;)TV}4Nv7`Ot0$Ylb$2=xL}0RQ^42|9%a11=H_g$w2tSQ0i~M)8m0CV^4V z6w)8nf*TqeSyitxB9N?QL}C#c&Z`7e;)$5C!m-Qq!i>X$qy<{Qj_c{$-zk_1fS2+x zxBpK8z|1rMBHny2>s4}e$SpVDChc)6j_e$G*4A=5VIbMHV40jEodUvKMHdrrd=e-Q z7S0HhG3dsI!gN!pjn*O_Zt6e4$zlv7s%Vp%P0AbId{p+OqS=9k%rB@k!@ks2`4+l(WNR;rG#q$0ML)k&8^wrNBu+;Q9&qgrU>f~Vy#A} zF95zJm?O^W%}l?b0AS{sABNZu!FSGMPy-)&@L^WTx?LIG_^g`}l_X=st1PlL@$@Y7 z3)?mpPf#Wukqb)p_xBat6H0u!O@AFXW7Wmfe+*t^mdU#ODF-tM%BuZ&u0c^Q^9y%V z!KRky=lf5Q0HnDAhLCEp8;DqDK-i^9koB%+qNs-z5rG+n_i0ZTp83+fhKAsb2w)Az ztFOL>o_p?@0>zNW>ryrYjwk?_Ir=~3GWFJ2VB@3G;pZl8?4_ZxuAF2nGv1%u7BauJ z1v4Bw?i%u;#fuiZI;t?oyqNkg?O&Eo$PK`~8>PBzwlT_gCzHiFddu=GSFKo(vs7QMj5c zR`LzF6p@&i94{$}touu+Q#od}Nq4Izo_kx^aL7 zm=N#VjjY8+#0<%3%WMLOV!3quuA84`CJ5Ix%Ae);IjTJ&ynOa-!3ts@<8k|i%Y7|@ zi=_d$)?-H~X4%r^u2LUrH1fgyA^)_QAKTu(Uf0^+x3md+Gr zAr_*<)XZNB4f10D<%Rw142fFC{=`z}M&1P2#i*i_UB8ZvXQ#teN z(wmHJPtQ4WGdo&a+X|h3(MZMiZB81B>~~$$g38DgEGs8qirBxaSJ0e@BNK0mIR5+$ zwvfQ35_5uV7C^%Ryjx9U2`i%+Q`7@Q$~Bqw`z{m!tU7>p4PeGyfBdX= z=C@2dXXFPC-8tQJWa%*HFjYQ)3nOGyt#Iz#c=a{Z(9l@G{ICV>@&5~De)tfEM+);f zP%P4Iuow$oiYb`Z{TRMhFuP8alKz!M1{@YZQ4q-EFzM(6;~Q#wq4c#Fzua_Ox!4Hz z4;bn~LxIkjdiuMd{-YF|?f@1PMRfuIo@>>r)ouWA6)I0X^108CDFB!rJ>;hLUAuX! ztDOcZAS=}5h4&oWGMQhl(A(GNI!HS^3a1_*R-BiyM-}mZb|8uJu23X>xI7EMXI9Xa z_bY5mgLyqhMx0z4%qQW(Imr*DxghZ@V5pdJvG@lAbrq6$qSIS&7k!LSu2WT?X-d09 z6A&1pzQ#ZEa1_rMAl< zxrhh@4Z?&0HUpB$%0hOyKTHU6Lqs>md^gO3NMurGa@q-hLmP4_)qbM_fa%d~+zL2t z>5^qGj+%^o`7_D*?KHvynvkxhh{nrxL`bJBm3rGM3oGCvYO-~e)xo2rL_mz+-Wi4~=g zbNfYhdaV%d-v3hIB1$m7{Wuo$$a=9|X82MO7{KJ4nUb#1;E=47h#Ni|_!_Kw08T%M zh}wC?m@XW{FG;iLNKt${$bzeYx%Ys zf<-0*!Ct@665mdO1oe8OMj3N{Cze`orT7{Zfjn}CU-?eExCECAU6a7>Zz`r~pk9Cz zklG#Ds5a#bYU5K10Lmv!`e`au|CbinV_+r}aF|Kv$9WSIW3B_jZ3(HY9b2;0l`(_O z?)?@eGW#l2B(k4evj(m7UzXsqmY!RIKlj9bBmQ4gQ_=lcQary>QK2b-yaF)3wF)s7 z{J{QcGcXqT7$0YlZk&-N%OO~bf(`ejzcwELYN~6Br5{k0tCE=(qv+QB#VrNidjd6$U4`(McH ztF0-UndCIzL|j%Uma4nQiYWL?W(OJ-n8Jp3#A>{e)u$T(0*PyuK`STU8HGb(x?y>+ znOLl}Sk@v;M5iAB&x!R4Mn^~806_TwDxgj`CzKWA&j$f9=ggy=x zsqh0oPs|ZE6y|D4_?`tYQqvlXF%ynuB{-rs(0r^3Llw9zW!N&i1bd#@7jpqK56$H< zq5$As&;U@&&*}UV*(IuHj`^`|X=tR8;lczUHyaNXWZZJlA+;u19euY_RLfNWgk`#9 zZTM0w@38%=+$-%`jF&c<+sf)I#@xb|OAkhzj*4$FF0KKc-*~|c~@5#?b-8=0)Uy;0O}hWT#I}dGt7!G zf3a-|=0`XO<-Nxz#>;X5x=DX)8Esu$;)!6)kC5Pgo8zw%vU}wbsjyUWFqsv(a4so6 zm5E?Y(n2O*B`P|A#;PF*X74%QBe#{N0OOhZ`ub#h>#f}q5W2d$Y4z$=5)|Bkr>?$^ z&5H3n&B|CBEme>cVb4&t(Somh^^1W=KKJ>g0)XiPfLU|jS>Ml-)c`J>`LS*3Xyt)5 zQdAl^3Ep6*N({CCU6cG}JFxsRTQ0|Bl_LNc4vZ%k0Wsg9=8`;ADJ7FBDZ!zY6x0=P zA%Mm}f4|JjID77_+fv=rCIG_e)2C!Zh#B)d7A;zorxn1-j2wvZ@d+Ly8C&0{3jm6j-d`7LQuIq?#Vz}-l8B{ z3I5fl2T0SDz{LOn4FBx2&rnZK&qW>7&@g`XvnOfk(xtR%)8=e)5wrsMMbPAmM=oJP zXaq$f2eot=(nSM+fx!Wr3Yr4}IHSBo7tH)s;i_zTZ?~*I#H`(*EkG zYGKe8Tzo?c04@Xoz|2U&Lf8aq zbP5$)_wIuEz0B`H6S8K*X?a!mwERz6X{}w;+zf=$IskkQh_zb|J?lLiQ?%3O`h`ZE zT$U5(J}c&<*t2I3?b=m*eNAX$S6_7vEnd7tMr`tzcgwBv;#?$IIF13ZuukL^>#w9$ zD_7I;0uZnlUCUbr%Jh>6Im>YQ@)c4ucysrgavezb`+H3S#Kw&q^RMHgow$$!fC}ly z+2yo&EuKLpvJ$v7C%YUHcJ>uT&>^463(mKF z%$G=7NnVx0u{nReh3i%LJH5sEW!Qz_Z4M+sP9ZmK0KoG27TANOq`P&<1suw?2Hdm&YbM`R zMS-CuU~M}?>oLACI*v@bi3**B2JpGA3|s-B?&52&xvTxi=||~z%t*|yhhU3zSQ=sW zUJP@?(iD)iB$JoyARt_T!UTq{&ThKxmOJR#=bv_4^+(<-vI*zRaZe3L-hd0$C;%vf zSoKHp`CoDSHMir(*jBshs;l$VJvaufq7s!df50EiI*5d=JXV36FCyWM$u%N-yijge zrWLpYg`2>)?=&56@*Xs!z^8Cg+BL&T)zaLWuhH=L8=28yLKH5kRmw@InHh2EvJ!fV zIoY0h<{4Lq8j^4BXXZCnArdwzFKnwfLyI%C1k{U|3W$vP8RN2oQ#!5NRz9-7GeOlg z)pX+xH`BAvJuMTvoY%lTKltDWsiDp-^UrmxWE22Q&HN|;`fuFU7CYzIv7>a=l~xF!IHS8ZLbYo+9==-FqVbq$}wEW7`{2Phn>B4^P=p1GuAyT?>G;w?II%s`r+t5bl%qy5`E%5*S=Ugj4wjVOo!KB-{pGjy6rn;SXPMq*uF3m!CG5e z%VzvM2XH~L7~?afKXM7MhNO`XAo6?#FfFdWY9qb+^H&OfGm8(y&Kd_t28yH7A{yw%a^arr8HYwMh0^=0@B}84iz$e zzVvqk0^~Aa>Tl9C3G5(%VlWF?TRCwuKSc$zMqk_YDs8!TTXtL)$zGh`v5rY@%gnKk z<))G2-22GqKA)JC0KhK(#zYnY|l%(bgKT?Z%h&~oOe)zF|AWKr>;V( zO-y1|TgiaZ!Ez%&=I;DuEoWlKw$0Kb#$)hT)}fgGuW{H%IqA0 zA}PjL-}3({!Uw}980<66;GZxkjLrrP;LpgV_$LUAzj5QHte4#>^^?iC9Gu7u#EZ{m zpJilnj&344I=8-|(Z~a5v>q8A;eDy>AOW*mE7l6r3~-yA0{?XFrh?FlDI<%Me%V`5dQ>_hz_ko7;Syz=L+RJt>n0{zzsO*(|zyLTO z%?=8S7cZt2D^}9^^F6LhgI&4dN||sa9N|69jP#W2Etrxi|R&p3zLKl z@2y$2hTeSZ&4TCMw|_4!n7@EtfAjTX08lC;s>y6?xIK(ZGAO)YYQ{fcFgSJD0RTVX z1HAb?SIK|XHFV82n{vb6CiP{QN+312p#b%*CObKks}X?zz^IURP*X=nM&!U3CgMAz z073Ue4w=^K)DGZ*1^~cz#I>VNwKnVJce4jd%lAb)>4PQEFnf8J*+i_|y|smjt6 z(6qdK1C)h7c=%w!iqS8;_#8d+Yv;8IW%0KWHOO2noEC7HXNHe8>0j*oR zUOIttotxVtb_=!AnR#Yse%&lrr3*tF(4Coo{288KII9K+2TgCVmInZJb?(w8!Kz;& z0OT|P#G++Fl1+Wo9GUqAyzC~~i+cQRsjfvpfJ(;_ioycGZDL|lE^~e2#EEycpo!bW zn^h}TWi>gw>JRgwawp%^Oz+10&dFmr=Fh{D- zOH~P56rj4M)-|k$)qk)AwwnfEnFbidC1HYXsu$gRBd*w`4gwzTEH0CQHGH3bx^tgMo2Pi~pQ;qR^mxB){E5U6x%a65qV zdw{xcx7SM%%%eGT=So$$zP3I))iz*O9mcZ*0FhubFfc%ej~tZmtrT^3cAC?zbGj0M z8L|G#oqT0Ve@AgxJ6Pm^z}Tl@tl0VkeT{huE~^3O5%MCMnp&u)rdm!oL&f8uTpQ6# zY1AlyABMNk8sUT;=pS&I4Zlt1UTg@NGX3<8tyD*)h|##E~7oclLjvstR<`QCmb zRkRrMXPYRZ0f^!nfb|`yzFu!2%ly_rsjq7&0020zkc{Ls0np$}u)M?20w5hQLr@ek z1E$sjN=E?mtIk-Nf1>UAT;Hy@wrUeTZ$||~H>0A|*KNXj<{u3l+ zwY9a$ceQ!bwG1wUbnwstsW!Vw&6Uenk#kZH`oo#wS1_@wQYT*l)4NIkToRcbECBR& z$0W1>Hvqs`z+3`=WK&~fUgRpbWzB})VbJj&moL+0!4ed|>Fw(+Szv~YrSo25e!BNk zIthI~EapX1+-zo9+A`)NzEsARZIA-Lr2P6~b29}VOV4ZaG)Ct1@mc#6MT0oYOONIU1gui_TpeX49K)%3%0|!c0#Q~5ZEC&X4 zTa&?=h?RHD_Ag8=#L1Duec<4Jdi{-E*;qNur|vm(3miVkz?+Vf&mP(<<>Ygh{x;^f zT_4XO>lfIZfi2A~dHszsjOoPl_*sIoPN2!~HU`ga^WRVI{b{l=O$`ge1q&8ZUw@yh zQ&6HR(mHOt7z7?<5P0!D4*-0l3wiUPb3alojn#egRevO>cs$ipGJi3fe@cL0H4_Uw zAU~eWHTtXp1NGKP=g*&aU4j~RDpWTN2zx1QfB*(Kw3uQm%(w%CO=EBg`#Bk2vq{c! zJORVQLz4N6-4FT#eX@GhT3f&514}-m7v^W!S2wlxVw&vwbsK2a$~AQC#8GU}BcpAQ!J9lt++;WqRq7K-WZ>tju42}}JhBYc?E zU?|U|v5)Hljlgz}wGU&Uy{(;1&Q|K_Img21WHGQth~#PJt%n!{e)wM30FdwRbxQwr zYc~`Os6--JP=+hl@%ap0;PuY~g+dd-z8^X4C^>GI{)Prn?`nU-5$KFb+Z|P~hwaN< zLtRF)QPf-)u%s4{=K{#L^Kl+l_eq*%y4@U%nsbi33t@GgLx&C(W&Zi|7SKI+-zV)? z>s`1?{X9l@*9dHjH|5RZLj|E_OP0&kbP+an=KAONMfpy?0!d$nldqV{pVcVLYoY3t zTv^HX-jD*ka>c6b3hVadr9#y|?^U^&1^GZ>y$y_muC6(3dbQI*)}Dq(hKq#_|CvGH zS_XlA?_~g3;@p8jfP8wpEh#5_=$X8v8w>q2c}y%EHou!AF#niv?1u)B^%rDqMImbr zSn+*3!9FVl0AHRBmyTzmv01np96Gc>XySG3y2LM14Y9)>(O_RbsX)&5)0zLN~sLaUT%g^P=*9hS7g_cxU z;q~D7Gu++K3 z%JQx(b=U;x7pP0hyU&7uO#r*}yZ8v70<#$R)dq)8P?Ay1OuHSK^Yj`Yes~G_4 z00u$F;xu9pbtik1+)1g~_9d0rN z2VYOUkmeZjN}#1795fw<>n#QsE)fAY4FH3) zR)!$+I|`vJCt)HDrh8U9iiE1bM9Ec4D>#`+d%NFt>$%hW>wyf2)m$cf|?o4;y?{&YP*YCaVId*2J zNBTbd)r@9(j-BrB_rCM@g_KsOCbI%5IcZ3onm4^yO5YOsm;BZT9 zra$ub!i|ju99EPCpdMQf%VNqj*4^7J;ul6xZP60;@`aadMMHOSE8soc3fPhq0I;$| zAQ&c5U%k-fuAME==QpbS+=w0DHI*NN3leb$sc?ZCFm1X40Pv^LDb}d5zmAIm09(eu zCNfeCYs6EMY{+K@SRe=_vJA$~ZxR7w_qWMyx84!jZRKx|n1v|o6}=Eq${#&psSxEC z7dHQF{I)T}H1jIIcmCWEn^P&)fV#j81dHv=nbRRgVBwNzra!VlP|ncjvH}&{0ti7W zQCqksCr@f)-PzMZU-at*L1|EvSp>0wcO(S>x@-@^)Woi)##VFYy&v_@M%DVqSpeDS zV_nBUc>KG+zu#jXQZA?&GddXCz0>&K$GPvdKnt9qqR^H)EJZvZ%B2C}Kc|#YS8yqW zYm#D-qqtxi>WsD!^yDMJX@c>Hc>hW(KP;uWbLJLp?icRwJBn!?uk@yM;P};xQ$?mj zj*3@@kw~xyHCgogm%i)ki-}B`=c!jC2a08ZE*L{P{J zz^O$LP64(4rThF*t*!{VhE{GPvg52-d8YsNPINtvU7<_D^XEEgN4=~1#TuJ3e-hXDttdiyklA8bYp!00-~LnUzh*^z>ThC8@rBHPs~b?bHDCh<1S{LQ1ttL*f?*|Tk&boBv+Fz2yTAT= zR8hk9)F)U2tYEdE@k*05+zM#mR=`MA0f2vjVW0bKO2{ub*(F*_U8S59DHU(`D=^9* zQRQcA7tW`cC>UwtE=gToeQ;7{&z>dn|GMdg#+H>UuG38SG&c{M*wDqnl73Ls5)2Lw z8PsC+b!m@_V8F|f@5DXnX6|5;$MTB2HOaG#8fN* zfc9Z@ux(62A9V>x3#*`50FVs3YQI2Ai_EvQOknM8Q@C<>i#~F%St>33Km2sk zI>-!U*x55@%wnZ+<3u~JvHNqY$E*D>zw+aD+O(+^Qhui(zuuYw$OjUJW#NdD^$C8< zx_viin#GaF0w{3T4~nc@q%2C?o!JV@X(0K83Fu}`Uiy<&EK!xaE$AsaSoPQaaUw%e!+xQAQc zpRWXiP_Y2;3%>qNe-KKvc;RBEHi|SiHH$PD6d+qbQ%_txpcH=`=`i?Pk~9<%-v-|o zRAtN7r`Sh7@^Rz!EzPa0x39Y(<<~g_jMibr8hESgIGa1Wlg*eulLKeJNPkM-R5l{v z^#%_Ca>k377)k~=LH7EWTlvw`-ysTQl9A$z1`#L1N-!6$$+~pPua1l==qdlMZ=?o& zA{u?SN1Vk10NA0>ihr=G0KgIGC5}X(QJJR~)-1eYVVHrHc~MUh3n;?ew`B-Q73}b+ zf0qq9V1YTL<<*ZJJIWQkSM(BuQiAmjBHcBdhvG?E3AUYI&-2TGU{CK^Hl=+Un>b;z z*F3_8gYs$FSYi`IuJw8g5%XvoUv}jOc+QzKCvhphQbEF1T8WWvLxYb5&Qb09Y5^0= z|2>%U8MaJ{-a@a)tf~WmFGxvzE@T0`bzIb{&*EmbTGoo)Os2YYlRm1*C#%H^MkA7p z)Z10lf&k*^(IZBlf79j-?1T4y*t7!1x8?-^Tu6?S$(j3#f{J}V<%UZBVTIu2gF_Cr z?5!;mMDYl9yn)*yetu)BwY z@RVu6(3;}Pe~YyMESUy3w?T%hQ5)j`fF%I{9?<~+^6YcJ^_9raxBAy-i$C=@tmtlJ z=bx(pL^(uu!y$kM zY$2}&peb{ayS@$(=7y5CUQ=9VCISGs8}Jl&1D--XN+=!J)g?$4vCD?%{duGjy?uR= z(R~{gSUE+GAHxrentXhu$1C|)%)SeQ z10r3C`T#l11epO_%{YpgZ0*MBbgHb%kAR}ioSfto-)KHpx`!KRK zBsEEdUpSZAMm2@EC&L($R|&lBqsV~3h4c>gm@$#BceuOM#l`n z4;adC9y%y$8uSudQLxk8VzdgYyS*e233vbbO3zqq5cAymKJgidIRFIU77Sas<0knO zXFAD;_nGBUe!Ne6`}BfZd6Smn3wC2YYmg_~(AV3`|K=%Ux9e*}Cs6>PPcBN53jiws zOr{tIe!u!Ss^6Yi|7*5(?K)9zskUFj#BJjyHb#0OZK(JDk0#<@jKJrbGkcD(SoF{O z<*y!PfAUA4GJ-SB<6A_IUL_3CtpJ(VwULLakJ(Oo|G8e)Hff5N1sLaX&l{#;Ds83q za(vGFawtFQB`~7BR#SW|-{)Fh3mySnw~{=ye7k-K~0mWx&m#pDyYIjVG~+3 zb(zpQk@fU;N1iwtyomz=ywuicBuGsJ2($^)q1{q$d+O9F%>r-(KojYtQ7S(`*hZjI zODVomKNndbuQ4bl7+9ps!wLijo2XrkIa|+dOcVfcE8rlv0#Fn1p#I$MS9Xbj8-|3Y z(y8Ej4bp>kU|*TaCbvx%JZfmZxo}}H#3WQ{LGuOjt-7xTE8ugV`GOIRMd3!ADlIy92N;&hz(fZJrRA`>LEg)fLP^ROz?u7C@ZR>x7z~@;5b&i%UV(Oo~sn zBBbTyU4toqjs()u*$`ndZOUGp~d zzTxLwh4sZ%P)L4L zDYl@eT)VznSY|acT@iCj76AD2N#?Nyt=6Bwl-j<&pR?O;eZPN!Sx7Tgo;I#5C_t&J zZwf|L$tZ#((zJm<=)H_%^pRD$$F5wkkiB{AnBZ+w<+ayeV=Gpy6d3~}9oIUE_4IWI zedqaN0wEWGvAh=n+#;I=06~Kg0<1X_r(4#c%7sN(_;Z~L>l0iM}?ql6;|c=TgTbVnX{NWm4FkRoC)EM~2%O*` z@LqoRF=m+^07cljYo{1$aV_6j7cE*W%2&hstHFX*(L+O+EQ-#w;tDtX8M-^*r`He< z&`X4o`~TJBkFk5#eb7{HzH^|0FCTFTT!CTH^_LL=P`ETmL*`4f4O}=U2CnSVn2cU| zbr-w-x>cd3D_Bf2uvn1tTW(uhC)Qkw55KL9S(G)H=wBIb)(O8iD=j`zY^u6XkeBFB zq@MemFMY*LECBc*u#bZP_{)C6*KPJdSBCv=$9DF@i#r69>-^3IVn;)vknq=H6`dKo zzRO%q(Ji20n}w&vBCcL?wJ2rQEB^NF-^)Sk6>ASZs`msNah|qe?5r{6osp?ZM5T2B zMHpJ0Ck6~ml7GRQZCHx(<5rD1R4m1(6KISg#fQJYxrklAq)dVzlL{+7E6M^WRs@B( zB~8p#$g5%(=4mX&}LSpgIWfvv?%4Nef5i;+xu$y#20^;NcG$M3Aq!BSba zYyiW$-Po zSL3*T{ac~|zy|@?qkqo7@H5O~HJzXDHG_j*B=$5*ru^u~KV+Z&)6ZJ!<5O(X#L29; zzc)5BP^chtuyyNJ_NIMUgpj>^UuVmfE)Q8Y@Pz@Q1Lw~drTl_UyS246AO767 zDeapeUYUrd;tVtS^pu|vD1kK00jszFDTS@4e}kP!>SCLWpDo z0Nf%Ofa)y@mBbVu#%@(c`JLGBC*R+*6rHl~`clxK=H!1LSl7F_Ufsd<>*YiPfDZzQ zUj8fp!r$k&U*YSI`I=gbAb=RbRV$GdvMI0iu>+6$lMblMU)bgL`>Jq((h13UNS9P4^cJU$0fkLrr zHVo-Jf#ob)$9wJHzc=)LQ#p{MZGG>)JyvEY=8frlgzM8S{wAAj0MOzCTmAJ#{s+LB zMdo0pwqPZstE}(HjTzN3PycqS;0w$Vp_(9o=APjK`2?SR_SvZ1uNe1z+pV{IBqI8* zuVhF(%Igf1G$d1}P7xP39>@29Yk=}nvj@NpEQ+Ld@lBl2UcS#M+NG)7t}g}j^y=^z zP`-ou4FPbZ%=ho#XQK#%U>Eu>U!STO0I&c865TtKy5nGG!XFzZRD+6gr)KefI9v;K)*Shls}DPXQ%bmgKT`vq`D zx%%NFhob_+pXAr*F0M!aUXuV&1M(Mqp+)Wi{fYJKeoInihuoZXX z#BbkjFYjKm~$DTt8h7$zgz&&efBJS7(0cTMWxo{UoY z3sd;Qvj^o6Q0ed8=lT83t|9#`joRUd24PmWj-5aam@>s~kLX^su-HbOGz{-FK}M#W}84 z0*y{U1O)XmV%zkj(A)()Cjr9s00C6wFs%{L%w{q{9elNkI@N!Jv%z(oqQRsXUcgG0 z^+w6*)2Bsn4=h=o^X7?4*h1zk;vB&p!2G}wlQC))zeazbU#nXQ04f6l=lu#t6gL^Y z4%@apE9UsEU2{)lqYqMtFu}3*?6Eg?-Ff>OCC!&p{(*rDVrq;nf*d!1HQyL^0Vb)G z<^qguiZ4nbQR`nyQ%|LumdYU@bphcF>N#N6qXwfGLAT>oORi$OU$IgH{IwrkCjh7r z2%O;{@NRzh*L)e#zrB0+u%4c7_L2KPW(*t+nSb1mJ8<9)^Du#$&#jn#n1OSx-fm8fPzKMAgl5Vyk{P+IzJM5zme4KU6u#>p%*si1j{P6pN1O=obYSkbDIIp~F zns4t|eS<&T(`9Po(#4@+Hhyw*=vdcvty7n?+R&9k$FN_#IOsFsFf-y_rW9X%?ST1O zNy<@4D`Tvb9|F#TatbKoZF~`2KEbceukma2BmqEWK>(xDF+>27ywBKkJT zo(}{}H3ttKFi1gR>Vi8_H~qa-pV_Bxn)Ytk0&tz8#;~Id6>LpH0TM#gDW)xztD`T% zLXm&3Et^pb0xMvzSwn)RA;hY_PXJJP5P*aDSq=oK(D+9LYV~7K!13Mx_%>U|LEwrj zuJl=j!_wK=$r>9QjJkd~I$T$NF)7)JumB1i!=6=Mi~MrH5@bZ=E0f~Or;KTT);3GJpNjmxEkkg{f-6Jh z9`d$H2_%NA{M3;PAVE;>_NY5Wa=;f81}3(fHn7C;Gq`{H?ev5 z@}>ClEz~AduA|Rh^izxCZ4x~M00~MHuHkq8im$I1`rCRezu|IUl}OYK+_{mX*7J{H zcdb*I`}%u>AY>APZyBGMb1a&AYE}6mAc3(6xd2rJ0bEVr;kx& z@@K74|6rGQU3)!%n?D687vcb7cxpra7`E0%@4}+9(W$JPQR~Vt0HCSK_HZk|{$_%x zmjIx8K=2$t32$c}6B2T>jd8x5H2ozA;30L_&PMqBj>YFU#;{v*27YCRam?D*&#g|VJ@tc5XwN4q*k;JB+YD+_7WGQjM^m_yV zl?MVOYj5R1@VET-@AcN<@DJld?p!~NL04@#*dhu`_fD_}_$3^|Kd7}PK>=cwjN-uPV#YX} za5pZhpUod5$fF2oT*3T$r5aqtbc za^-bF9RTzM$_E0FdO_D^>FjeOc6`@~O$ipFggBRn4cTg4Cxo)Y_g2T4$;rKOz5S-o9}NPe|AoLekBa1HE#|(B z2cUSxyCA5^(g9sqb^LCm1W}|UsL@IJbGv^}chukc3j%=T3Mj?ULL3_XyZhDMtaJVX zk2$~(1)xAk(t5{b1Z);SR&x(ZmGcAVSxa*ZOQlmeH=qg%2mrwEfq>wp*3?s~oH=Wq z6>!?W#s~ls8VGd0@y)M4#=H?}fgCwzMdf+GAezfGM0Ai?r;9RP6QKL7kScGq2Z zYvasaF<$^6;3tSK)G0egyuyd%A5;z3g9G1ON$l12Aml%lz(d^yfBiUe7-Cf&0X6s}B8a zXs8$TV7)y(F;RcFq=KC z90WG;ySJ#1_xAR(%};F-13^VOt^@(*aR;`wPhmYhXW7W$P}t{J=K)sI4CntPMfol# z#g_sOK=}U_*@SDVl=mb6s3H#V^*hE`XeglzP$Aw~dDn^r)ETLJg+ zyBHT_aJlW;y;DqpdGAfP@Lhi#3#qB1aH4RC|5xA8DCW&Ifh*20+L21*mGr7EMee!W zts5FjYCOkO=Aztl03y{@k?-%}gd6>w^;Z4P%46DRd(27p=Pm`wWHW5ao9!o}X?U{&?q@b(#2w(v2o zVm&acqMJKy=sAtQ+*OB}SUy|by2G!?SsEq?gsl;iGTqgDqDxEp@i&}2*(J`qh4NcU zA75*6?Tq&G2mq1+0(*Q$VH9#q)1OBn&TpGvIcx8p&#K$1u3F#NQ#p5$vmd`u+m+*s zUigF`UUAnhr{7&`*UFMS9tjtXsw>6oq!~rb40f2XT& z95z5Ni0=Qb5q~=8c*C0H&y#1nJXbj8eSYrklgs>OzS_w?YtziGbBjdpW_>bVy{MgC zV&|-?jO5m$7{Qv`YH=_I4hI8 z1;?K5$}frE-DKNkAAPl5-`#rY#X?-16AqU9#TXqvIV3bRA7Gy; zewTIak0Un{1ot-_&}wll^7OL*oaX;8SaWI}3&U1UrlJEJ%l0(+{y6_5YeD?8O+o_y zYJpch9JsR5tCoY&VN)Z6`akZvg968TYdhAP{56`sWx?dv={2=e=l^G(`pcw|@3abN+ctzCBfnpFQ*Vv(Fm#_hXa49t2v&%Cf`YA9r^%<1zO8 z=dOD_>s6h<_Kx3@c*o#oJv=xVJcuEP iR7R|El&kZa_@CW5cSdoLNc&X=An@@3$!+TmJv&A=2Ag@_qv*^5oD%*&&N&%c&_PO>AeDD^ zoSjSkM+8X0ZIA5Mz=X>w5rmGSV$YSV($=#+BexMLyR1Ix>FWA?Q{GT@a{%fnu}=5) zITZTO34H#<&9CxLyN^~!EsPzR-FEMZS-^K=dp`dFnMkgGdV4F}3U=ai?`cR;Z-0*- z45)#vDnGuEukUUN5TRtwyKBQk3s#gm;<2-8=4&)sEk(%-FE5=+ii)xyo4ra(Dt7ya zipp43sy|0y^klmTD;JxGzYF`1gqSQRCI&Y(Jw2W!MQLpN1oWjNqHi5@tk*VC*lxS;Pb%FK%Cw@D%zi(YlfeXF$GrPF+4T^eA@!!z%z2gIXqKRMW(=OcKKdm%0 zxarqgVzMQ7M5m^v7PpqQTGNkz!VNTHA<41kl_A(6m|2*RR!m~eWohIV;2NS`5L0u=ZK0{4!DmEeE%`4f8y2?>)+^+(pT zC9^Y=YfLGZKDf|=fcl?fzdW73*1LY7qklKE>YRFewyyYedtwGnX5P*Re6X(^E}1Dh z29BtZ;B(x=kf1*k9yS-AYz>p}hpayceE%K!fnVKLF|BTKkGd;LO z3o_Tpy-sd)4?6vyHOvO2fNqL&ub+Oo>l0W~m;m92t;WmEagS%Xd%E?Tlamvd*@R_l z)Y27;iyCwX&AxxUmA36)@XCl=-S5S`9(I!UM^f5-R1rDFhdbuMmlt=$D38~tlYk=? zk9fqTQT6QdU!VEPuPvDkU+W`NNz(GQGT6KPk;mJ^`lbZz^=0v7L6`;uuXsYpRR1x( zFxxs1wIi3cj%wm{^)U+P8Zp_S)>*%L|KE%-Oj4*?PLWj%_)$ z&W)4oCGZXSGm%VTbK*zCqAXDO=<{HacA$`WKdU`EZF;N4+{f~*GT!|D8%UO%|EEkY z27=B#j)wSHshS!P-5JsJH1@QgT8ezIxR+VrzP=iF#1wgZc1Qfe<`?;KL%Xe%7x;n_ zf&J@V%FqujbFl9|jo(mG#O>JpZza>ASm%D6W*l!qdOSuYbyqAo7mPP6R2n%;hFX2F zcRKRDL}_Pg`Va&eDxs$*l*YVsS&yC*@`%*D)zD(S_p9`vX)h~5f>OHZ3>$c)eyw=T zj53;3k;DX?SLa@>hVaIXT0N>=;;DRe8I|b@&G#`Q975#oU6#xXvVL#R#3O`os)W^e z8ENVoaQ1}YChI^dXmL!W+sUEXzgxL0d){qKs;$d4u6q^odP8m_Ou@3ic0l#JKXAaF6IIKXsmQ5 zg9+^Qti7V{4D2q~?4UJU?$vWgB>s$LWs^<0=>IE2x3#B`4w}xb>aWz<;*$Hyd0iJ~ z#2u4tOwV83OuwHTbOtJriPd)LI-{`I{cENCQ3~|gglVTb8d2V&Rfa{TsG&ebMsy<{ zkA#%u zTu$DE3@(DL?a1yhO_KkIPq&Ih{Glrr`js=YcN~-oj|ubsE~ifIg?>B?jpU<#P)7)o;&xl9pk79;m` z!W%JudbqJYI{fA{GDQjyPH>BobZOO?k8sd=d!`^T3z7wMelvHGdttBVtIx6gsA-1h z`$z~@#D3mKcDX;Nnx(Ur4&ePK;u<6Y-)YDBs@*VZR4m-#yf^DIJ9m=vjzoiEr#4XP zS%HsaiUb2>nI&H{=E6u)&x?FdVLUJE%jIK@&qF7OP+C%26mIWFkWE!w?B^J6Q(|M$ zEAhz@XU%>5`FdM3YWm2bwW1jTQ%>#cJr$Ba;Z4OXpvJr_OEW?d%JuryeND<%rxMdw zT*1uyu{l3Jt-=euyd6ZCFk(A`5n*#^QxuZ#-F}7~O-lTsV35fg{zd^O$kVCkMnK(H zibm|B*Q_MzBg$64bxk+rdBs{A31B${JKyfwoX-<}jll*}ey|9dT(~bXhj`4bZr2?$ zf1>`ydhO4U8HE)mq%X}Rk^j3SR%TK9+%Hs;i7S(G?)rozAek5BggcT8nu{knB#|P^ zG+^%tU}j<7X8=D}PnlNn`P*Z__20110i0iV9cohiAZiv-a#rizh(9H>z?>e5W4BqD z3-<%j=y46dXoKc9JlZmPDZo6#NAwKe;7o*;!>m4&#y&)Nuy-PjXRs4(v@I_!Thy7_ zna4}Vya0mFf4{KxGM6wHRaY}%7hO32l`U#+P8@y5Cs$$As1E6%5Wj}k-gjxogcBh` zc)a;O2dJ@LNhJjRYLamkC%mEwZcNH=?{FaJT`DPA3F9<=yr||PHW*LEiJJne85+`S z8*{cOwJ6iVeOM2t{Y)GvD8R)bLjR}gCR1R8N5+=4GB_@gWg$qt5&;9{NfNBl* zpU>TA(V6Ndr#_qJqYCeRWbl3FA@Av`>b>DwCnaZvdp#0VGKE6q3DGc3YcFPz@Gq>` zC0xZdD?WB{SR$AUoL9Ckj}nF+2?UE92i1MuJF`;jaNDqkSFxbf`BJj6GkwaAQ2x8U zI_8jsq-@IUrG2oNHu4w#8f{%ka}8(q#yI9Q4Lc1L7csk*|2#92|MK^iKu8Hca>e!y zTYKT%ew_&>5InVIGUB&K=04nuPj|&5l`iVLvaIkSf`}^*k2T54XcPva6LSy--b+mNkr;VFw75yI`KA$f|MMV*A(`;l(79bGja11EPvnC_D)?+H*EOhPy zyuTT;e7@XJ?|0p|w6+&CHXuR2#8QwxeyyQDN3ecsAggm5ZT_81p@fnKrnriVz#xpa zVBkIr-X={Z@%W`lyX|uRACYE0=4W~|c>;2*s}v|S&G@%c!4){`CJCTDK;-OC z=*#BOtCY6 zVH+uchm#{IDJ{lMm-^ZTPw^at0Q%%{uF}5V(WBq#Hz{HS49_FfVL3^tff(Xum{RWt-_+hCBb|GeA8r&>vXor_}3QgXJ9j& zg;LN);3(|=1v@rDoWzCMevyRaRLT%6sl}YIiixDzx;RX5^HjCdqi>WWAtQsZvQsJ3 zc{u(JPB5$MxgCg8M@kSz0)5$o0-d0OfRb^EY6L4|n!wJ^#TPZ4eXz643q5X&=%RdB zNMO}xV~GN~8ORLk{kNMEK9}$A zz0#6m#F)Gu>oMo3EV!+95aMhs=nxxyZalECpBx|mk^Szur|__}8`5p{j`AOLzOuNy zx)5XzLhX^jos!xdQ$jIm|GR66zeiiv@T7iY(; zB>%U2S5|acefs%5G_Fb$N2qcWIRGk!<7c@@w%(=Qv#JjVL!b{d_++sY(H{*uPX*xM z;fZ+|NovuuGzQPdKH+WQ`MhB8HP+!{z};gxqVdlNAZEgIO47{vJ?w&uGavU_u^}Ur zoJF9GZZl&KzX{5kVe#J|Wd$nXTe03xP#=QTRGPj- z&{Hy8C+F<(V2La<6$xA6gAm4gDFRn0H*UZ)^Yd}9w8BVRq(nrv^g#m>wgzc49%`q@ zDtp0TQ&w7U&b|#!UO~A?Wo5(;!e;s&rq4#pID(l!+O1pffjn~%z5l5bt5X+;}+EWWOAoU&ye8OF%Kg8{%*io zlIia;Yn#h=|15MIZV6*^vfz*p2sKmUY-#QVd3o+>aAV+&ENBSl^gdKGdYj>%YJ@jU zcI&WeQ@Xpvgb^uddnITvOrn6Q{R(s5_s5$CES#zk?|<4nY85b?1~~7M$z|@_-jq=N zpMgTDzI7Xp3BrdP@`em>QmC&xZ@OA>$9@Kbfk&8Qh!&TJ_^x{v$LE{7wvHSiPEw+i z>D?um-EI`L_q^)Ag7v9PQW^2f5i;J)b>S!^HC0VSifbe9Gn=`&o%G@wX?x_dLx-j| zZxA}}yH;w3iVL6w%#H!t4Qh-1#jQ8@2wLwj&|5Tj?{RmDs2F?FYLde|ib;CU^^ zc{^=;hOse+5z(X~DbzzZ$6}oF!^+ znPooDw|H)1Q#1*dKPPh{`+hH5;G)csO?DDs3~!4D>vgXc@=Z8vuviJtt>s8k-|p$# zbb;amd%3QH$imC_5FMVXBQ$l=t1YgF#h(MzF6{NKPlkI&j3|F*eW*nHq3<^|R>>?~ zV#65w`-1}UXG1)`7Ix%-8v#@m2)%4aX9`YgNGIt>p@yQU#pkotH^*Z*iKFmt z&3pXyoxr7dYd}3z_l@xz?8@#XQd~BdMIU`2A-PAY$b0yDWlp1*=i9v;k$Uk%tO%}$ zO-4p`|2Rcl_~t-+Hosc^_2gbe#PP3btmu?c&^;1tBx;l?)GxbWy<+#u?Fd(h zn3d>~CQBw-6>s1XUTaORvVijVW8MV@QAwuR^KMv#Jg)JWwY0)k1W$CO|B%rexldId zxofZKhKuHAPO8O^yY=AnOQeMC*;Y0gA_BkOJ2oOgo%>-#htMyhV_)W7-P|T0T|aDR zW76(RIDP&w8e5^_ZLip^*Tcii!ctV9pP*A|D7DopgiR(a$I)@A(K(0kwdO!$(XLx{ z;MWHVimNJ@QtaCg7w1<0#N_c)>i&T4N@h8uF zf&u!E!d8lvJz<|CAkhl~h=S-(O21J} z#BsAJHQ@wK_De1!DrF|ikQxRRGUe{l&@a>lg{`z!ZrJiJAZEEykwTIzx977_nn1-gu=Hjg64Ut2z;594To3xkLT7=?ZVk9S;w+ ze$$=@N&Lf-OR#@{?qO-&>B>kY23(L30va61ftK=g7<6t6x}PT7b@l^uI#insV`wfN zf=7@FUpnFP_UkNhHpsJGg~VAh!8^?ie?p1e4jovRR%WR2f>bhvH~pHPCNORTr+6sc z$dh07#bK@s50N9$0xOPjb%bPl$r^{=L}H;b#;<#w-pF}*=hF$gh6JWhS=vQ+?@cVp zNX$*AB@;fuqk*L)mp)2{d_wI`Ho^yx6eMsKl_Y}Iu#@5L9Yo`@@py^Osdoqx{F~uq zyH)TfU^FYVRV1mBkGTepQf4%zhuS&_vGozvy~!AR1n|swaj3T4)&HKlBYGsJpzj?= z>#s*05EVe@xuTs%4!l5o=0nourU-Fm>{-aleNI}w*lBOf^M`REVHE~D+Q#>+ahiFW z5(}Cx>QKBmiE56|xb$Wdk(gaBnnjUgIM@k~*p5y_@L|k zPCRxWqmX8NhB#Z+@u6nymfoA%P!nltf7*1V;N0IV>eWH>0I(s>FVJYYM)8a{DUF!Z zs)4(UZK{*IP6({O8^QIvvnEL*1@W9(K&D!RI{c8KLjn`1e;>?l|jPq;!r$Xf8yZv=?wNSk8^E_ zAsbOB#vxm~qq-BCs$#fm7@i#!#ylI@NYJUt^_bt+b0k$4s0Zho@*mu7tw$2#A}so! zYWpd#L}WR8a(afMvDplol@5v|BR!KJIZlicRR%CSts3=Ro9xW$&N5Tc_Rd8|vQ(=q z(|mDuem?)iSqD8HBOjiA?es5c`$O%w4uT%2plCeL0nnTr|B(e}p$1VQ?aNVQis+L6 z2AcVfv;g1{Uk}lY1W=%SHnH|oay>n5IlbZR=%3`}V>7qy~|%H>muh!DKRtrT9KzVNk4(r-P|& zP%u;2HCD?~*4EZw;z2-Mr_MJmA%yzsi-o=#C?x=K2VpzxnWZhjjp~H0YWz`82yuEfoUi&agr3KHRu5gI|uQ;z>9QqwId%FVsQt^G)T}jk$ z8yRc$;c9ny&g8|u#24V9G1n@;1^=}!Abtrlp02k`HCKi$9s?elLYzZT#qB&_QDa@Wq82Qv1$Hc41=fAiN9+(`1E$7)-s zXAi#+xjWJ)mZx)9@-oP}rr>+S#fZJN@L#R?V;PSLB&R~rYXMU?P z2PciWPzhhC!F9U%V>H*hq)Wv=76D(t(o4VTKalLZ6p_BJZnRN5bv-^iOh9lrhy^V(&X-Uv)(gc0QjyJ`(dJ z_jS%{Bp}hiYekRh{t$xV9}blasTsk;&>nUf-}fC;oxy{l6hJh75L%a*_pMJh45&o~ z{HfAVxcHic+br{685LhkV!6TZz#G72oWg9+-?UVf%P_qB==x`BO+%KTrKc?PFVa|V z1iGIyDuU2JeN&N&6Z$VrLtfX~QEo0Jy~>CGoKNr>fI)Ej7j+HQ+3}*CVz%I!7k6b6 zbN;>gKdu6%5x%-WC(@jy0op!yIjA%LWy|#p1r~cGz$7x&YdZNh{}?t#kwIJT6leB} zY6PL(sac@ZiR1E zDYK+2OSpPH{B?c?|HhM)>GVVkpBFJ&7x?R5fMd3SOrFILZ`Rp=&Kc-pCNGmHRTUI~ zxjyVsP6*hP*mhrnbZh{|U(H(B!ae*!4%d9mcL;od5lR)xZvTHulSS{CvPvTP5^^sw zSi=gE7BA-|lSPu1qSw2UUh`Q_mOMZ88a;EE-_FkAk0{lQxI0O@F(j6F_l7a{I$I*^ zlO;2=o&1>fU@0B10}$TLe-G4=Yv&;e?RM$$sM5e-!5r2P3fsSf-|#jy?AqAKMg!`w zvr!JUgmTh}ItUS@2U93wHMG@g9J?fULNTw*Mew|)r&YX|ScCsW|J-nmYNoTrdRlMG zVHsk%Y)u%zK)z{2O$ru*CG%wWd_^j!UfBwd#sZ&T(fXK3nW!puUy(v%Qs>kHQXCm+ zx^V0Lcen5{2sUftO@>EM+@cnf)S!An@6X960Zw!h!0X{5!;hNhceBe#l$oLw4dyj6 z9#o5;TzH_!X@aU=Mvp9`9Di1l0N6}sC;lK#IQ(Sy%IsSBHS|J*-&sV@*JOn4OVhP+ z??KT$*495h;7_rZKK(036oz6*k7Sd3dxS)*z@uPxqTgC8d&*SCa1-i;#AA&SdUCQ_ zBlp?i;qTQJ_iq4WJ(Ak`M7G_fiFR@@r{4k>@)b>b;O$xuO%I|FpgpxtoNFI`^#$cG z3NkEbM?fSvpP8Mn*5f*!EGwI|9+XfC5|Nty^t0o!o+IJ^f@MC) zxEV0MTe-Wt`)SS#P2mCmVk0YWtwxf}_s`nEye;ijd$Ll#Bs}g6AGT{^jU$Kxj0HI} zN#RUiLqe!Mi$15ODkz|0mD5h>N_+$&+t&Q;C+Xy(!E!rOD$0rNg_|Z-t6NnsL zGD$LG_HXV!%Ns??!r6tU=u=1rg^Iw!LzS;~?jZa)M`u#BYFpvAf6(Ke{t{R5N-$*D zeSJ~t3HwynVlg59aq-xDH>L34X5J{*ez~DmtfO-a`Q3Yc&&7|#!|{0NK{F-}ILbd=OEPp=sy z%!Ve{E1)$mt1-L_Bd+$Xuyqp8>iA%{#qBMgNzjdV-@$<`*L5v}^}^RWuWE3BJ&Kq; zG13-Sb_jmHoNr8;QTKz*dbb0<)#DJ?XPaAU@tUN z<-6m^^>`I}6R+2#1}S$y|y?s?Z(BgQj>l+ol>VEIIruW8{)N2Z`i zcE=y=aSn*xtvCxE!JmKSXxrx2uQ6wuotv?|q2FuUQD0CtX4&pOs;{dX+A{`shIwr7 zn=G~5t*X^xzJ$t>dj`23FHogT+~4J8Wz)SyOhQbd7nm4W=6QASa8Akat+OSLMp)&Y zqp$_WQ_fswbzLbQ&Nn9tpG-Xf3yKIbR1Oe z)}ONn8`BAM8_G1Y?i;ia`LEr|L_GX$^G=smhK$b#(KkF?vRE(H>~NcIk)0)GT>hho zW%bzuJ}2XO9uy2)pQO6}FN5;38vmaE*MCp^>A1EA+!=!TK@?KVX;s~=UJS}sdxV|& zZuaVS+~%9X3JWihY?fi3=rs_4y0{q|6C26w36UFIQC@bw8`YzDQkZ&}ii6oXBDbNz z4UvgusZf6e8LReSR1Nz?Ixg^*?NS}Z(T%rYH`nz?Lp2sKBhqGMP(~r6d>M}8(io`#lt%Irx5&uDvTcEk`?rVF=tsqygq`;qp`Nj034xOBHcA0M@| zIAi0_X|x%MoOk!9$oBndFpQAd4Nb;)w;m^rdfrAaJ`xCohKEGy$A(<_7Zu5#u^);A z@e_Ev=HCCp7~-+`XxCSIMjVu>-mx=re3?$m>C@APd;GKwPhBc*_Swx*Azx{Jo951e zzNon%wW8xx>VMJYa4-9-?FP@f->YmjQvMFTw_Z6x0TSiJC}35YmhIHIkgz4}&Ut zyLU416UDNrV1;#wKlDJTuKm~Y8cip0uggJ(giXz4i@OzH3T+*&n2v)S${~zbI~zOZ zA}fj8m()vdI4$6dRIAm-H6Q7GvEnF{2Ya=U!te6GV&7)etcQz!^8BpVnZm&IOpVLO zA4t%Zkyk2l7)~px+vueQ%l3jp6p1wrf4aZgydw{f8-#qff6|6Jb(J&+;7mXRL4TZJ z{8VCj7HFi9h$R2c228DiKs^U*X}MA!N=ru}vBh+pjFLeQKJZQphaS|ty40j2*i6e6 zTaB$-w<2_LNEx1z+(b2(XeY`=Xy_t9z|2=@3+cXT^C0QwFRX4 ziMOrAJt~6QBlwd7yhO}M$4VkhVHY_LvLEu{Ex4%9WMz33Jlid>JUlolaPc3BqTyHH z<*FeKD~U`{DsF>0N>XRhnvUnQXzh%n-K{`?gmMZbINY=*&4YMWtuBmqrAe*c>>s!Z zQ0?`J?fknsEvX`dfNB`0d!25LJ;* zho8s7EMSO6$p{%4S&l_7#G$#Q$ZGH(U7gKrs+~e@u0@`DsXG0$Sg>03LEDrOBEo=$ z#KBp-{kuOOfl=ecss^X+B7skc+PRgjkMHbTY-BBsLd-dSog2!=EGu|dnyv6UrMG}z zy^WG#5^%sPC63-}w{7I1s0_#1Lc?^N+kx)$#UE{2Q=zkLq};OUIz?ToSs5Ai*+eyd ztS}ZOAOR`c`qKCrXlR1^6RK>X>3p7LL2W`b7I2QYfEvqr@ghqp|6vvT%Fxy7`e6Y>E{qt1jJ9=CY##y;hOXix#QDo=c z>eZ=8oyVl9*Gc4jH$bT?qZQXScjX0e3}&B4loP*3cWo?uLIz-nXIniKjC8L%x)TJt zcB9|DlV*}knEhu~LV!aN#kFmh23g<*SthtHFjbh7lTx6)3U{3Xkx`eyX`oK0!wtaZ z1%L(`L+_Q!Im=cUvo~eq@tv{%5?3_CZZtBK8%qWFmrVNTFT1%Z?r03o5d7~qt)>qd z{bHj-)|Zkz=4+(S!y`Mo&mjDP^{iiU9F^C1uoLqb{dp>Fy;Qi6%|QVPgL_}(TSR&p z@YS*Ab#Gj;#svZYBIfNQ`fh^XHjPXqMF%4Q?T9u}dCe#b|wYY+cQliNWHKz)2{6I{cU{(=DD#TrisjL+&V5?g>YVGuWmSR`xLZuz1 zRA~zFyZD^=P+JxB6uHUkaOO39rKiAkA{bP)h-(WIyc#vSx){blcqVK{0_wq>*LZXp zZw|AWr9+FhA7@9&YV64QB?vkIWAo{ZZhOyVYwq0jrL%~6GaOE9eulZnEBPf5cYztR zlMAydY!XZ9WL(o4RMGGBfW^3hjdI8RJ|nJQRq(%mdFC&AD+5B`MpIoYzD0ry{L z0|iz+evT+NLXO{v@Yu+Dk?~7es8J3mnH`f79>Y-L96$I^I`q${lG`yUDXE#IsoiJL zaS4AR0)9!^aqN-G_ra}mU0V>dF$&1vR5q{$6z_*z^z_|ZjIc{IwZqt7EBMIvh$p|n z!foEf#~q-2XZQH{xZm03d+9#>DI+7pt;tnK7mkx=&Zsr6@(rPEv5t^_vf_M>B3@vr zc=Gp-Y)0tgHO8jmcd?2H_;sPT9t?$uu+ z=J}BVRJl+h4Ap>63X*&+-6x85uf7BgzB{j{a;-_u-Emgj-=H6kn4O+jTI<$ztUa(X znc_-Y6aYxqm6N$l13sVA39gw~gQBsDaPX-tB_M2+?g$ghu73w%c)?L*8?VOjzfl;B zqQrW;<|_Tch-(>#82XW!K1Z!>;4X|9}bo4a{Woq@qM~esMn+8n=jK> zeEChjg6$V#lwDQ&nZXEppgjdnduuYF18vJ(sB995zyf*^9U#Zg$L~e0yGUcp5Bre# z1nJjiQC_S<7~vB&g(mrYXMP3b;12WO^``J*lGffqz}D`Q3HpL-B9?A&w@D!(MBMTQAW z55hpJsI_&5rzheXE@e#g?!KQ%YN`%V$C}Z(EK@RumE0&RBzuKw&J~G$LoK2 z`ufwpZ6)AXP3oA#))5NJt35;%9UiU?(8GoK_`Wkg#*6_tL)=$iD1gL`SxdkU#ht|- z3h)coC0C*H*cdy0!w9d+%G$(C+Gg#=n^^bL;r3hD>uT#1(`$4KJZksw?;GClf??db zXzr=U4}M?rKrR1Tn~6o{8D;2qqJ6Mk8gey$BYgi{=4c#E+>`G|&R`_bHct24X6%0# z*54Mm>Lze!#B_u{fW zog`GT{V9#&Bb4V8U*>`6Gm0C<*T@g-sCGqzgT)dbDvl%XxLrDr&OpK0VH*%qp<`>I z)5MoVB(=&q@FvQ2f8OdZ=7pZq|K`<_V(fUok0Xv0BYJ!R3`HpBO`6B!R|^bwjCo;v zr)b?S8P895q1>;(gMS{3iJT_hmR=b!=C_AV&XV}sdc+lmW0M8xup7}89#GpIj^Es^ z{p`;00m&Od<2aOd#;x&hZF7#|)62FWSEJ!tEpL`af?VA%HPmkIU|MLko#^;umHxgH zvwT^~m2OM@OPa3|exDc4vxpHYOmP-?l0e2yuOK_P?dcYKdA)O!0x@|3tj9tzB~~B) zjv?HAF$SL~DfoeVbnb@V(PGHy_w8xMS#L@)&>K>pUqC=A*#cFROjpIlvo z>sbQ;`Jx0t0gE*J!|1HdT7)1Dt%L$GyQ@&o%FR&!A&!%;eK_wOsOREGYFvnvx&2do zv9v7B&pe%lT1h~p?Gv#9%HoV#Q&z-s=7$1R%IA$clEom_XPF9Nf=ANvm;B`hSCg2wPnHb28V zHQ208|7QY&8js@n3z{_5-u%IT3-u~0Py+3$1(NoF&*gnz|Vd$@k0lY($q^^ zSS@Fe1*CJT{Wze%AM%GXd%f3O_r&UKc5LW+M9zRJ1P>D){Xp4PDZSO$_Z=KQlm!Tv zjN01Tmf$Fq>z#{J{|NA3uT>Y}u)qC@{0W6;P;l|^qR7O``9sW67B_nQ3wvA-u^zd( zi{Jj#)Hbk?T=Ip50ZBG6>u2lh-!lK|NiLEP6!i>p$X$fp03<|#KV{APEZYWbY$iTH z>Bti(VZ#pBiS`Pwl9=@59<(*`--~B0Oq#sX56jyq=m|Y~`MY+Or-Op5w=4kM9(#sX zwC#FXc(Cpq5(5VSQdeZ3cZ^~^a*jP;qQcbUD}TC7V$EC^Kc+O7goK7u&@9i2-@2^z zL97Kx#_1P;DXnO3_KVxqB%$NUY0ig}$VHPI|HpdX&|t1w{KFf}p?=e*C%Kgv9}3`4 z>L}=OfeE*oqhPgXdQpvXZ6`=5N(r)OUAtd`4$KB02&O zP;rPzi3Y9XPkf3 zq!F}80Dh}-jE`Op_>y`MNh-`Cu~J`U$<2-K$g4D@7`cQ|iEl~Dl~`v@CofR!&NXv6 z4*V{PCo_HJVbnD7N^$_qtw2id+0LoNl&4V&nraS(Q|RngoE20H`M6O7z&$9z8R z|HQ?fel&6|g(+)KO^}r#etBy#PCFw4@n5MoFr3xa+a}41GuS6~ zvCSXC-VXkN5$x`ep!F`3KM}+eOYZ?-VY&#P<;vBMZ5#xY{O}JaRpqL~{V6|1o;%Ep%Yc-3h};YHP^2!3q~<}IY(6t=ImHmfUVuzJ7Y|b48!K0 z@iM=wOiv=MplA4JS7!)K?;W79D!%218~3Xh;VLeH%VL(<0Mn*k%E8y3$WQgvqqOx z7AH;r$f+_kpJl%rT2N>F67YNWx%0vZQ^6cLs=qOz3clfAJ~O+>AONocW2@Fq(KhGJJ+F%dXEp zAChgXeUD?sM(Jq?f`U8aSD(rj%?PhuhNm<(6&OCr^~FLEy&j}$U|Kuf4@7vVGz50B z(z(?m$|(Ysihp09O9;^n*ju)pvJS~jZmI(4>G7r?KgK9V%PAq~|LpsXTT0lKOhD6r z25&%C!XyDuf~tO)&gcr$ffTiuJHDShcA8;jE2TXUY|X967SWPrkfkuS=j%TFY`p1F z_TO;M_Y8G$Sf&kpZ^leCgJI@2^t?t3n}n{6e^d#y2@>;RMgt@sIGGp7)6l~tWMP2g zc^kY2bJOZPV~NCA^K7>I*L@m%J;+c3d-?-U=G7)u>BEn>JY1ICxrPP_jftyqFiYX^ zTJDaZi}`#c0FB1=gV)Tp1e@F{PsJ2 z^q`f5A6QhrV&>v~VsDTE85+j(NL-t%RxgS9z-UA)lr! zY>NIsdrl6lp&8YTyO4SJ$vs1vpqatE1Oq}J&mwA{{ac|edQUH-i~E#XtN;u;?{^MH zq1SKnp=(0_RKi?hPK1FG&7NJvkOVdsz7^~?scK9w$T`3NYi}^2tO~xu_x)#`OtDFNU;1^nocG zGmlBB59-tFRCwmQGCw#-rAKhssQy$j>{lZY(XKI_l4njJS;e~v|2LFTuD09@p z{q9@g0Gf%k2x;rwnu)B>wLS+<4#+w+t(jAVYC+AF;W$c3l$$ZHr}+EX=p(pBU!LzT z?ouX^E!g}SXo-FfJI-rmzE}N~m>mmy5$xE)Ate%3991sY(p@$th?>x%_g!LQRmT;b zfAK*-xGE}Q6}o~K-5bvW?@9VhBcg6H)5-k7L=?wz9Fse2!AoX*-J_iME}~|7dFMsw zn&A#qp;CpdpIZZkDnnmx*mY`Gzm-Q@suT@ZPKDAvgDZ@RgrL*eJRTTdea-Ij1Lhl-t#TMGGnb(>h+NP1F1>kCW zg}8D?Skzo^{)1r$b9JOHKFj(XdtSZA=VQJ85_<0>i+L%6@q|nilxDyqWgD*e%BBOa zCQTx(BjHu6KI{YnMiGJg3JO4iqxCv{RNAd|b}ei6cE*S!_vgeAcoXi2Mzkg-GBQar zHl^#zJUUi>$^wq##6#^1jtpAdz!)FIp{-**E1yWObARDHP7{yyId^JC;uHi$SOPLj znID499j$~cQ+_E7!34Xp>SJ4W-F}R}uBiD1{A()4=k*7r zvZdp_!;76&03Z#dT1|Y8f2l6I*?IbX(HvJ}PULLdhJ;Iy7yocow;qm#PH3zDyoZ`$ zV>=AbKYGI~3ami!eBK|g59MiQ#QoG6gB4_;y5AMajTVY(p719tW&j>;cNPA2$ zHbraaZ_E#MjonbG$#o%5_RxFF%l2Pk)(>Gty>1=)hb>uzI>2sSL0TMOJbiZMwU~u} zy|5KE0Z;MpXUDgY6~#DCU}ktC8I)^IwKUwFCF zLU9RJJX%YB+q7t}!Lt>Qn7RtX?!bPu5B5DN0LO`5fZw)tc=F!rg`Q&0J2B+pLReYZ z9x>r^tRBZmhU6(1$@4d+RA3-1BW*lm=8jJo6&`rq{@r8_CxI@(pcw)0*ZC}1vrZ1# zwsP6axEpX$bbp}JT9MJI=9)q`k@7ovRT6#a!?CM)>p&?+_PrW{Uk0VF&%~bKt z7WEO6EgwSe>j8#}QXBF^h?47cs4P-(b^BsCT)aWs9(+j-u6n~Q_ethmzA5O((>m>Ppj7Rx$<%@PQYL-3a=7UpG|viJ7(_9cN10I3)ZqtOqb?h+(sLX95|&1XLuqqT|R zdx$^h4N4)x1%|I^N9cW3jUQzKjM+9gZ9xO5_u;QAr|xd@p&vqmNN{Otjd(V@7@I5W z)TGP;k8?x*rCnSE6~;~2;e~VHINU7jPryO8<{>N_k)Qs_uxoaLK%BW|SO{8fG%KV~ zH?E<|ubSFv>UXO%)5{qtf&1S(^5+02uD7avK_85OV5dn^?f)=$R$*~8VVmy3-GjRa zmqCL|kU($^?mwfN({97uvYF6#JnCqv#W_df9J(Nm)wr@4_aM9v3i7!b91Ot@ zBfrq7#jB6RS&WQLgE2!g#%pXw4Hw(JQ@E?Lt@w9~-S(*NkUE?tw7PgvDYGGLU^`xK z{{{9Pi+gUW|2i{rxH#h z9EwsAeQbRBWt7~3(~4Ti2w8I&Mq4xnNxqH?@jGst_bv-fqpD}8zA0S4xB19;(So<^ z4?mifNNRaxjkB!tg2FF9A*9N)VFSSkbi(?-NZEW2Vb`fN{h^P2A|#uxGccd8?NMMI zy5xm zawe|WdHZ_}D;42$Q&l|?PHU~G)*3vN;1 zTL`r;eAmcz`e9)A`z1o>ZCT z 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 literal 0 HcmV?d00001 diff --git a/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown b/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown new file mode 100644 index 00000000..998ce00e --- /dev/null +++ b/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown @@ -0,0 +1,58 @@ +--- +title: Sprite layouts +layout: tutorial +crumb: Sprite layouts +classnames: + - tutorial +--- +# Sprite layouts + +## Vertical + + @import "mysprite/*.png"; + +Example Output: + +![Vertical Example](/images/tutorials/sprites/layout/vert.png) +## Horizontal + + $mysprite-layout:horizontal; + @import "mysprite/*.png"; + +Example Output: + +![Horizontal Example](/images/tutorials/sprites/layout/horizontal.png) + +Notes: + + * Responds to the same configuration options that vertical has. + +## Diagonal + + $mysprite-layout:diagonal; + @import "mysprite/*.png"; + +Example Output: + +![Diagonal Example](/images/tutorials/sprites/layout/diagonal.png) + +Notes: + + * Configuration options do not effect the layout + * This is incredibly resource intensive on the browser + +## Smart + + $mysprite-layout:smart; + @import "mysprite/*.png"; + +Example Output: + +![Smart Example](/images/tutorials/sprites/layout/smart.png) + +Notes: + + * Configuration options do not effect the layout + * Most efficient use of browser memory + +Example icons from [Open Icon Library](http://openiconlibrary.sourceforge.net/) and are released under public domain \ No newline at end of file From 7fabdf1ffecdf83bdba925a2dd7fc659d8db7bab Mon Sep 17 00:00:00 2001 From: Leon Guan Date: Wed, 7 Sep 2011 01:06:25 +0800 Subject: [PATCH 081/290] Fixed the issues on compiling examples Getting errors when running "rake examples", making following updates: * Use https instead http for github access * Set use SSL flag for http client * Fix the link for compass-960-plugin --- examples/downloader.rb | 5 +++-- examples/ninesixty/bootstrap.rb | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/downloader.rb b/examples/downloader.rb index c8e841dc..8921dd23 100644 --- a/examples/downloader.rb +++ b/examples/downloader.rb @@ -9,8 +9,9 @@ def fetch(uri_str, limit = 10) url = URI.parse(uri_str) http = Net::HTTP.new(url.host, url.port) - http.open_timeout = 2 + http.open_timeout = 10 http.read_timeout = 30 + http.use_ssl = true response = http.start do |http| puts "getting #{url.path}" http.request_get(url.path) @@ -25,7 +26,7 @@ def fetch(uri_str, limit = 10) end def install_from_github(user, project, ext_name, branch = "master", working_directory = Dir.pwd) - download_link = "http://github.com/#{user}/#{project}/zipball/#{branch}" + download_link = "https://github.com/#{user}/#{project}/zipball/#{branch}" extdir = File.join(working_directory,'extensions') if !File.exists?("#{extdir}/#{ext_name}") diff --git a/examples/ninesixty/bootstrap.rb b/examples/ninesixty/bootstrap.rb index b2b52d70..0a976dfe 100644 --- a/examples/ninesixty/bootstrap.rb +++ b/examples/ninesixty/bootstrap.rb @@ -1,4 +1,4 @@ require File.join(File.dirname(__FILE__), '..', 'downloader') -install_from_github('chriseppstein', 'compass-960-plugin', 'ninesixty') +install_from_github('nextmat', 'compass-960-plugin', 'ninesixty') From 8ccdab41cc7407595446a71040be369a0a65bea2 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 6 Sep 2011 15:48:10 -0400 Subject: [PATCH 082/290] refactored for cleanliness --- .../sass_extensions/sprites/layout_methods.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 72eba293..d91ff85e 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -7,21 +7,25 @@ module Compass SMART = 'smart' def smart? - @kwargs.get_var('layout').value == SMART + layout == SMART end def horizontal? - @kwargs.get_var('layout').value == HORIZONTAL + layout == HORIZONTAL end def diagonal? - @kwargs.get_var('layout').value == DIAGONAL + layout == DIAGONAL + end + + def layout + @layout ||= @kwargs.get_var('layout').value end # Calculates the overal image dimensions # collects image sizes and input parameters for each sprite def compute_image_positions! - case @kwargs.get_var('layout').value + case layout when SMART calculate_smart_positions when DIAGONAL From bced2770497356fdcff2a26eb657fd1b8ba1dec9 Mon Sep 17 00:00:00 2001 From: Micah Geisel Date: Tue, 6 Sep 2011 14:57:34 -0700 Subject: [PATCH 083/290] Inline fonts weren't being base64 encoded. --- lib/compass/sass_extensions/functions/inline_image.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/functions/inline_image.rb b/lib/compass/sass_extensions/functions/inline_image.rb index 2c59f765..c0e732f1 100644 --- a/lib/compass/sass_extensions/functions/inline_image.rb +++ b/lib/compass/sass_extensions/functions/inline_image.rb @@ -12,7 +12,7 @@ module Compass::SassExtensions::Functions::InlineImage while args.size > 0 path = args.shift.value real_path = File.join(Compass.configuration.fonts_path, path) - url = "url('data:#{compute_mime_type(path)};base64,#{data(real_path)}')" + url = inline_image_string(data(real_path), compute_mime_type(path)) files << "#{url} format('#{args.shift}')" end Sass::Script::String.new(files.join(", ")) From e95ba130826efc201c5a6870da3e90f383a9c7ec Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 6 Sep 2011 22:37:43 -0400 Subject: [PATCH 084/290] new sprite tutorials --- .../spriting/customization-options.markdown | 45 +++++++++++ .../spriting/magic-selectors.markdown | 74 +++++++++++++++++++ .../spriting/sprite-layouts.markdown | 13 +++- doc-src/lib/default.rb | 18 ++++- 4 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 doc-src/content/help/tutorials/spriting/customization-options.markdown create mode 100644 doc-src/content/help/tutorials/spriting/magic-selectors.markdown diff --git a/doc-src/content/help/tutorials/spriting/customization-options.markdown b/doc-src/content/help/tutorials/spriting/customization-options.markdown new file mode 100644 index 00000000..7a31d257 --- /dev/null +++ b/doc-src/content/help/tutorials/spriting/customization-options.markdown @@ -0,0 +1,45 @@ +--- +title: Sprite Customization +layout: tutorial +crumb: Customization +classnames: + - tutorial +--- +#Sprite Tutorial +<%= sprite_tutorial_links %> +## Customization Options + +### Options per Sprite Map + +When constructing the sprite map, the entire sprite map and it's associated stylesheet +can be configured in the following ways. Each option is specified by setting a [configuration +variable](/help/tutorials/configurable-variables/) before importing the sprite. The variables +are named according to the name of the folder containing the sprites. In the examples below +the sprites were contained within a folder called `icon`. + +* `$-spacing` -- The amount of transparent space, in pixels, around each sprite. + Defaults to `0px`. E.g. `$icon-spacing: 20px`. +* `$-repeat` -- Wether or not each sprite should repeat along the x axis. Defaults + to `no-repeat`. E.g. `$icon-repeat: repeat-x`. +* `$-position` -- The position of the sprite in the sprite map along the x-axis. Can + be specified in pixels or percentage of the sprite map's width. `100%` would cause the + sprite to be on the right-hand side of the sprite map. Defaults to `0px`. + E.g. `$icon-position: 100%`. +* `$-sprite-dimensions` -- Whether or not the dimensions of the sprite should be + included in each sprite's CSS output. Can be `true` or `false`. Defaults to `false`. +* `$-sprite-base-class` -- The base class for these sprites. Defaults to `.-sprite`. + E.g. `$icon-sprite-base-class: ".action-icon"` +* `$-clean-up` -- Whether or not to removed the old sprite file when a new one is created. Defaults to true + +### Options per Sprite + +When constructing the sprite map, each sprite can be configured in the following ways: + +* `$--spacing` -- The amount of transparent space, in pixels, around the sprite. Defaults + to the sprite map's spacing which defaults to `0px`. E.g. `$icon-new-spacing: 20px`. +* `$--repeat` -- Wether or not the sprite should repeat along the x axis. Defaults + to the sprite map's repeat which defaults to `no-repeat`. E.g. `$icon-new-repeat: repeat-x`. +* `$--position` -- The position of the sprite in the sprite map along the x-axis. Can + be specified in pixels or percentage of the sprite map's width. `100%` would cause the + sprite to be on the right-hand side of the sprite map. Defaults to the sprite map's + position value which defaults to `0px`. E.g. `$icon-new-position: 100%`. diff --git a/doc-src/content/help/tutorials/spriting/magic-selectors.markdown b/doc-src/content/help/tutorials/spriting/magic-selectors.markdown new file mode 100644 index 00000000..2274972f --- /dev/null +++ b/doc-src/content/help/tutorials/spriting/magic-selectors.markdown @@ -0,0 +1,74 @@ +--- +title: Sprite Magic Selectors +layout: tutorial +crumb: Magic Selectors +classnames: + - tutorial +--- +#Sprite Tutorial +<%= sprite_tutorial_links %> + +## Magic Selectors + +If you want to add selectors for your sprites, it's easy todo by adding `_active` `_target` or `_hover` to the file name, In the example below we have a sprite directory that looks like: + +* `selectors/ten-by-ten.png` +* `selectors/ten-by-ten_hover.png` +* `selectors/ten-by-ten_active.png` +* `selectors/ten-by-ten_target.png` + +Now in our sass file we add: + + @import "selectors/*.png"; + + a { + @include selectors-sprite(ten-by-ten) + } + +And your stylesheet will compile to: + + .selectors-sprite, a { + background: url('/selectors-sedfef809e2.png') no-repeat; + } + + a { + background-position: 0 0; + } + a:hover, a.ten-by-ten_hover, a.ten-by-ten-hover { + background-position: 0 -20px; + } + a:target, a.ten-by-ten_target, a.ten-by-ten-target { + background-position: 0 -30px; + } + a:active, a.ten-by-ten_active, a.ten-by-ten-active { + background-position: 0 -10px; + } + +Alternatively you can use the `@include all-selectors-sprites;` after the import and get the following output: + + .selectors-sprite, .selectors-ten-by-ten { + background: url('/selectors-sedfef809e2.png') no-repeat; + } + + .selectors-ten-by-ten { + background-position: 0 0; + } + .selectors-ten-by-ten:hover, .selectors-ten-by-ten.ten-by-ten_hover, .selectors-ten-by-ten.ten-by-ten-hover { + background-position: 0 -20px; + } + .selectors-ten-by-ten:target, .selectors-ten-by-ten.ten-by-ten_target, .selectors-ten-by-ten.ten-by-ten-target { + background-position: 0 -30px; + } + .selectors-ten-by-ten:active, .selectors-ten-by-ten.ten-by-ten_active, .selectors-ten-by-ten.ten-by-ten-active { + background-position: 0 -10px; + } + +## Disabling + To disable this feature set `$disable-magic-sprite-selectors` to false before calling the sprite mixin + + a { + $disable-magic-sprite-selectors:false; + @include selectors-sprite(ten-by-ten) + } + + diff --git a/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown b/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown index 998ce00e..0851f78d 100644 --- a/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown +++ b/doc-src/content/help/tutorials/spriting/sprite-layouts.markdown @@ -5,7 +5,18 @@ crumb: Sprite layouts classnames: - tutorial --- -# Sprite layouts +# Sprite Tutorial +<%= sprite_tutorial_links %> + +## Sprite Layouts + +Example: + + $icon-layout:horizontal; + @import "icon/*.png"; + + $dropcap-layout:diagonal + @import "dropcap/*.png"; ## Vertical diff --git a/doc-src/lib/default.rb b/doc-src/lib/default.rb index 3320748c..dd315ade 100644 --- a/doc-src/lib/default.rb +++ b/doc-src/lib/default.rb @@ -1,6 +1,7 @@ # All files in the 'lib' directory will be loaded # before nanoc starts compiling. - +require 'erb' +require 'active_support/inflector' include Nanoc3::Helpers::LinkTo include Nanoc3::Helpers::Capturing include Nanoc3::Helpers::Rendering @@ -136,4 +137,17 @@ end def long_compass_version require 'compass/commands' Compass::Commands::PrintVersion.long_output_string -end \ No newline at end of file +end + + +def sprite_tutorial_links(index=false) + string = <<-ERB +<% unless index %> + * [Sprite Tutorial Index](/help/tutorials/spriting/) +<% end %> +<% Dir["./content/help/tutorials/spriting/**/*.markdown"].sort.each do |file| %> + * [<%= File.basename(file, '.markdown').gsub('-', ' ').titleize %>](/help/tutorials/spriting/<%= File.basename(file, '.markdown') %>) +<% end %> + ERB + ::ERB.new(string).result(binding) +end From 16bbc81763ad343ec145e6e3ae632e6c725e2f91 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 6 Sep 2011 22:39:31 -0400 Subject: [PATCH 085/290] broke out sprite docs to be less complex --- doc-src/Gemfile | 3 +- doc-src/Rules | 1 + .../content/help/tutorials/spriting.markdown | 125 ++---------------- doc-src/content/index.haml | 2 +- doc-src/content/stylesheets/screen.scss | 2 +- 5 files changed, 14 insertions(+), 119 deletions(-) diff --git a/doc-src/Gemfile b/doc-src/Gemfile index ea0c8106..6e544416 100644 --- a/doc-src/Gemfile +++ b/doc-src/Gemfile @@ -12,8 +12,9 @@ gem 'nokogiri' gem 'coderay' gem 'haml' gem 'rake' +gem 'activesupport', '~> 3.0.10', :require => 'active_support/inflector' gem 'compass', :path => ".." -gem 'compass-theme', '~> 0.0.1' +gem 'compass-theme', :path => '../../compass-theme' #:git => 'git://github.com/Compass/compass-theme.git' # gem 'compass-susy-plugin', ">=0.7.0.pre8" # gem 'css-slideshow', "0.2.0" gem 'json' diff --git a/doc-src/Rules b/doc-src/Rules index ee84cd46..884c7901 100644 --- a/doc-src/Rules +++ b/doc-src/Rules @@ -63,6 +63,7 @@ end compile '*' do if item[:extension] == "markdown" + filter :erb filter :rdiscount elsif item[:extension] == "haml" filter :haml, :ugly => true diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index b5c3d6ba..f779cedd 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -5,12 +5,16 @@ crumb: Spriting classnames: - tutorial --- + # Spriting with Compass Spriting has never been easier with Compass. You place the sprite images in a folder, import them into your stylesheet, and then you can use the sprite in your selectors in one of several convenient ways. +## Sprite Tutorial Contents +<%= sprite_tutorial_links(true) %> + ## Setup For this tutorial, let's imagine that in your project's image folder there are four icons: @@ -23,6 +27,9 @@ For this tutorial, let's imagine that in your project's image folder there are f Each is an icon that is 32px square. ## Basic Usage + +****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. + The simplest way to use these icon sprites is to let compass give you a class for each sprite: @import "icon/*.png"; @@ -45,30 +52,12 @@ You can now apply the `icon-XXX` classes to your markup as needed. Let's go over what happened there. The import statement told compass to [generate a stylesheet that is customized for your sprites](https://gist.github.com/729507). This -stylesheet is [magic](#magic-imports), it is not written to disk, and it can be customized +stylesheet is [magic](/help/tutorials/spriting/magic-imports), it is not written to disk, and it can be customized by setting configuration variables before you import it. See the section below on -[Customization Options](#customization-options). The goal of this stylesheet is to provide a +[Customization Options](/help/tutorials/spriting/customization). The goal of this stylesheet is to provide a simple naming convention for your sprites so that you they are easy to remember and use. You should never have to care what the is name of the generated sprite map, nor where a sprite is located within it. - - -## Layout Control - -Set the `$-layout` variable to the preferred layout method. - -* vertical - default -* horizontal - lays images out side by side -* diagonal - lays images out corner to corner none of the spacing of padding options are taken into account -* smart - lays the images out using a bin packing algorithm which allows for much smaller surface areas in your sprite files - does not support spacing or padding - -Example: - - $icon-layout:horizontal; - @import "icon/*.png"; - - $dropcap-layout:diagonal - @import "dropcap/*.png"; ## Selector Control @@ -119,102 +108,6 @@ might want to avoid it. For instance, if your sprite map has more than about 20 sprites, you may find that hand crafting the import will speed up compilation times. See the section on [performance considerations](#performance) for more details. - -## Magic Selectors - -If you want to add selectors for your sprites, it's easy todo by adding `_active` `_target` or `_hover` to the file name, In the example below we have a sprite directory that looks like: - -* `selectors/ten-by-ten.png` -* `selectors/ten-by-ten_hover.png` -* `selectors/ten-by-ten_active.png` -* `selectors/ten-by-ten_target.png` - -Now in our sass file we add: - - @import "selectors/*.png"; - - a { - @include selectors-sprite(ten-by-ten) - } - -And your stylesheet will compile to: - - .selectors-sprite, a { - background: url('/selectors-sedfef809e2.png') no-repeat; - } - - a { - background-position: 0 0; - } - a:hover, a.ten-by-ten_hover, a.ten-by-ten-hover { - background-position: 0 -20px; - } - a:target, a.ten-by-ten_target, a.ten-by-ten-target { - background-position: 0 -30px; - } - a:active, a.ten-by-ten_active, a.ten-by-ten-active { - background-position: 0 -10px; - } - -Alternatively you can use the `@include all-selectors-sprites;` after the import and get the following output: - - .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-sedfef809e2.png') no-repeat; - } - - .selectors-ten-by-ten { - background-position: 0 0; - } - .selectors-ten-by-ten:hover, .selectors-ten-by-ten.ten-by-ten_hover, .selectors-ten-by-ten.ten-by-ten-hover { - background-position: 0 -20px; - } - .selectors-ten-by-ten:target, .selectors-ten-by-ten.ten-by-ten_target, .selectors-ten-by-ten.ten-by-ten-target { - background-position: 0 -30px; - } - .selectors-ten-by-ten:active, .selectors-ten-by-ten.ten-by-ten_active, .selectors-ten-by-ten.ten-by-ten-active { - background-position: 0 -10px; - } - - - - -## Customization Options - -### Options per Sprite Map - -When constructing the sprite map, the entire sprite map and it's associated stylesheet -can be configured in the following ways. Each option is specified by setting a [configuration -variable](/help/tutorials/configurable-variables/) before importing the sprite. The variables -are named according to the name of the folder containing the sprites. In the examples below -the sprites were contained within a folder called `icon`. - -* `$-spacing` -- The amount of transparent space, in pixels, around each sprite. - Defaults to `0px`. E.g. `$icon-spacing: 20px`. -* `$-repeat` -- Wether or not each sprite should repeat along the x axis. Defaults - to `no-repeat`. E.g. `$icon-repeat: repeat-x`. -* `$-position` -- The position of the sprite in the sprite map along the x-axis. Can - be specified in pixels or percentage of the sprite map's width. `100%` would cause the - sprite to be on the right-hand side of the sprite map. Defaults to `0px`. - E.g. `$icon-position: 100%`. -* `$-sprite-dimensions` -- Whether or not the dimensions of the sprite should be - included in each sprite's CSS output. Can be `true` or `false`. Defaults to `false`. -* `$-sprite-base-class` -- The base class for these sprites. Defaults to `.-sprite`. - E.g. `$icon-sprite-base-class: ".action-icon"` -* `$-clean-up` -- Whether or not to removed the old sprite file when a new one is created. Defaults to true - -### Options per Sprite - -When constructing the sprite map, each sprite can be configured in the following ways: - -* `$--spacing` -- The amount of transparent space, in pixels, around the sprite. Defaults - to the sprite map's spacing which defaults to `0px`. E.g. `$icon-new-spacing: 20px`. -* `$--repeat` -- Wether or not the sprite should repeat along the x axis. Defaults - to the sprite map's repeat which defaults to `no-repeat`. E.g. `$icon-new-repeat: repeat-x`. -* `$--position` -- The position of the sprite in the sprite map along the x-axis. Can - be specified in pixels or percentage of the sprite map's width. `100%` would cause the - sprite to be on the right-hand side of the sprite map. Defaults to the sprite map's - position value which defaults to `0px`. E.g. `$icon-new-position: 100%`. - ## Performance Considerations diff --git a/doc-src/content/index.haml b/doc-src/content/index.haml index 7d7d88d0..bc74afd6 100644 --- a/doc-src/content/index.haml +++ b/doc-src/content/index.haml @@ -12,7 +12,7 @@ layout: homepage %ol %li Experience cleaner markup without presentational classes. %li It’s chock full of the web’s best reusable patterns. - %li Developing a personal framework is simple. + %li It makes creating sprites a breeze. %li Compass mixins make CSS3 easy. %li Download and create extensions with ease. .sass diff --git a/doc-src/content/stylesheets/screen.scss b/doc-src/content/stylesheets/screen.scss index 1f240bdf..f00a96a1 100644 --- a/doc-src/content/stylesheets/screen.scss +++ b/doc-src/content/stylesheets/screen.scss @@ -25,4 +25,4 @@ html.dark { @include dark-theme(true); } -html.light { @include light-theme(true); } +html.light { @include light-theme(true); } \ No newline at end of file From 0667ccf89c02fdc4e8a6f700ebb87a851a418c8f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 6 Sep 2011 22:50:50 -0400 Subject: [PATCH 086/290] true not false --- .../content/help/tutorials/spriting/magic-selectors.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc-src/content/help/tutorials/spriting/magic-selectors.markdown b/doc-src/content/help/tutorials/spriting/magic-selectors.markdown index 2274972f..a0d4cb9b 100644 --- a/doc-src/content/help/tutorials/spriting/magic-selectors.markdown +++ b/doc-src/content/help/tutorials/spriting/magic-selectors.markdown @@ -64,10 +64,10 @@ Alternatively you can use the `@include all-selectors-sprites;` after the import } ## Disabling - To disable this feature set `$disable-magic-sprite-selectors` to false before calling the sprite mixin + To disable this feature set `$disable-magic-sprite-selectors` to true before calling the sprite mixin a { - $disable-magic-sprite-selectors:false; + $disable-magic-sprite-selectors:true; @include selectors-sprite(ten-by-ten) } From d644e54a38753973d8e8a73ad993d13e5f5c8af5 Mon Sep 17 00:00:00 2001 From: Micah Geisel Date: Wed, 7 Sep 2011 13:06:01 -0700 Subject: [PATCH 087/290] add test for inline_font_files() --- test/fixtures/fonts/bgrove.base64.txt | 1 + test/fixtures/fonts/bgrove.ttf | Bin 0 -> 18744 bytes test/units/sass_extensions_test.rb | 6 ++++++ 3 files changed, 7 insertions(+) create mode 100644 test/fixtures/fonts/bgrove.base64.txt create mode 100755 test/fixtures/fonts/bgrove.ttf diff --git a/test/fixtures/fonts/bgrove.base64.txt b/test/fixtures/fonts/bgrove.base64.txt new file mode 100644 index 00000000..35faae38 --- /dev/null +++ b/test/fixtures/fonts/bgrove.base64.txt @@ -0,0 +1 @@ +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 diff --git a/test/fixtures/fonts/bgrove.ttf b/test/fixtures/fonts/bgrove.ttf new file mode 100755 index 0000000000000000000000000000000000000000..9f2d056f1e9c1dce72665d55fe271e20a92ce6a1 GIT binary patch literal 18744 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 H>~sGI4xoe0 literal 0 HcmV?d00001 diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 372d54e6..adcf746b 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -112,6 +112,12 @@ class SassExtensionsTest < Test::Unit::TestCase } end + def test_inline_font_files + Compass.configuration.fonts_path = File.expand_path "../fixtures/fonts", File.dirname(__FILE__) + base64_string = File.read(File.join(Compass.configuration.fonts_path, "bgrove.base64.txt")).chomp + assert_equal "url('data:font/truetype;base64,#{base64_string}') format('truetype')", evaluate("inline_font_files('bgrove.ttf', truetype)") + end + protected def evaluate(value) Sass::Script::Parser.parse(value, 0, 0).perform(Sass::Environment.new).to_s From 8a2da92c9119bd79250f2e1dcaa88bbd7d6d8388 Mon Sep 17 00:00:00 2001 From: Raving Genius Date: Thu, 8 Sep 2011 20:59:03 -0400 Subject: [PATCH 088/290] Added test coverage for font_files (issue #543) --- test/units/sass_extensions_test.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 372d54e6..5ee96b7d 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -98,6 +98,14 @@ class SassExtensionsTest < Test::Unit::TestCase assert_equal "true", evaluate("prefixed(-css2, css2-fallback(css3, css2))") end + def test_font_files + assert_equal '', evaluate('font_files()') + assert_equal "url(/font/name.woff) format('woff'), url(/fonts/name.ttf) format('truetype'), url(/fonts/name.svg#fontpath) format('svg')", evaluate("font-files('/font/name.woff', woff, '/fonts/name.ttf', truetype, '/fonts/name.svg#fontpath', svg)") + assert_raises Sass::SyntaxError do + evaluate("font-files('/font/name.woff')") + end + end + %w(stylesheet_url font_url image_url generated_image_url).each do |helper| class_eval %Q{ def test_#{helper}_helper_defers_to_existing_helper From 3514898ea1f69cc7260a7513801ad7c483fb30f0 Mon Sep 17 00:00:00 2001 From: Raving Genius Date: Thu, 8 Sep 2011 23:12:11 -0400 Subject: [PATCH 089/290] Stop requiring font type when type can be guessed from URL (issue #544) --- .../sass_extensions/functions/font_files.rb | 35 +++++++++++++++++-- test/units/sass_extensions_test.rb | 19 +++++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lib/compass/sass_extensions/functions/font_files.rb b/lib/compass/sass_extensions/functions/font_files.rb index c18ce05a..f7f72d27 100644 --- a/lib/compass/sass_extensions/functions/font_files.rb +++ b/lib/compass/sass_extensions/functions/font_files.rb @@ -1,10 +1,39 @@ module Compass::SassExtensions::Functions::FontFiles + FONT_TYPES = { + :woff => 'woff', + :otf => 'opentype', + :opentype => 'opentype', + :ttf => 'truetype', + :truetype => 'truetype', + :svg => 'svg' + } + def font_files(*args) - raise Sass::SyntaxError, "An even number of arguments must be passed to font_files()" unless args.size % 2 == 0 files = [] - while args.size > 0 - files << "#{font_url(args.shift)} format('#{args.shift}')" + args_length = args.length + skip_next = false + + args.each_with_index do |arg, index| + if skip_next + skip_next = false + next + end + + type = (args_length > (index + 1)) ? args[index + 1].value.to_sym : :wrong + + if FONT_TYPES.key? type + skip_next = true + else + type = arg.to_s.split('.').last.gsub('"', '').to_sym + end + + if FONT_TYPES.key? type + files << "#{font_url(arg)} format('#{FONT_TYPES[type]}')" + else + raise Sass::SyntaxError, "Could not determine font type for #{arg}" + end end + Sass::Script::String.new(files.join(", ")) end end diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 5ee96b7d..d965dcc9 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -101,9 +101,26 @@ class SassExtensionsTest < Test::Unit::TestCase def test_font_files assert_equal '', evaluate('font_files()') assert_equal "url(/font/name.woff) format('woff'), url(/fonts/name.ttf) format('truetype'), url(/fonts/name.svg#fontpath) format('svg')", evaluate("font-files('/font/name.woff', woff, '/fonts/name.ttf', truetype, '/fonts/name.svg#fontpath', svg)") - assert_raises Sass::SyntaxError do + + assert_equal "url(/font/with/right_ext.woff) format('woff')", evaluate("font_files('/font/with/right_ext.woff')") + assert_equal "url(/font/with/wrong_ext.woff) format('svg')", evaluate("font_files('/font/with/wrong_ext.woff', 'svg')") + assert_equal "url(/font/with/no_ext) format('opentype')", evaluate("font_files('/font/with/no_ext', 'otf')") + assert_equal "url(/font/with/weird.ext) format('truetype')", evaluate("font_files('/font/with/weird.ext', 'ttf')") + + assert_equal "url(/font/with/right_ext.woff) format('woff'), url(/font/with/right_ext_also.otf) format('opentype')", evaluate("font_files('/font/with/right_ext.woff', '/font/with/right_ext_also.otf')") + assert_equal "url(/font/with/wrong_ext.woff) format('truetype'), url(/font/with/right_ext.otf) format('opentype')", evaluate("font_files('/font/with/wrong_ext.woff', 'ttf', '/font/with/right_ext.otf')") + + assert_nothing_raised Sass::SyntaxError do evaluate("font-files('/font/name.woff')") end + + assert_raises Sass::SyntaxError do + evaluate("font-files('/font/name.ext')") + end + + assert_raises Sass::SyntaxError do + evaluate("font-files('/font/name.ext', 'nonsense')") + end end %w(stylesheet_url font_url image_url generated_image_url).each do |helper| From abace682759485e3e9daadb4f61a32967434c907 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:22:43 -0400 Subject: [PATCH 090/290] some internal refactoring im image_functions --- .../sass_extensions/functions/image_size.rb | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 0490e703..633242de 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -1,23 +1,23 @@ module Compass::SassExtensions::Functions::ImageSize # Returns the width of the image relative to the images directory def image_width(image_file) - image_path = if File.exists?(image_file.value) - image_file.value - else - real_path(image_file) - end - width = ImageProperties.new(image_path).size.first + width, _ = image_demensions(image_file) Sass::Script::Number.new(width,["px"]) end + + def image_demensions(image_file) + @image_demensions ||= {} + @image_demensions[image_file.value] ||= ImageProperties.new(image_path(image_file.value)).size + end + + def image_path(image_file) + return image_file if File.exists?(image_file) + real_path(image_file) + end # Returns the height of the image relative to the images directory def image_height(image_file) - image_path = if File.exists?(image_file.value) - image_file.value - else - real_path(image_file) - end - height = ImageProperties.new(image_path).size.last + _, height = image_demensions(image_file) Sass::Script::Number.new(height, ["px"]) end @@ -53,13 +53,13 @@ module Compass::SassExtensions::Functions::ImageSize end private + def real_path(image_file) - path = image_file.value # Compute the real path to the image on the file stystem if the images_dir is set. if Compass.configuration.images_path - File.join(Compass.configuration.images_path, path) + File.join(Compass.configuration.images_path, image_file) else - File.join(Compass.configuration.project_path, path) + File.join(Compass.configuration.project_path, image_file) end end From 7f8b6c29e07714a2fe614503c958426de8a4091c Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:29:57 -0400 Subject: [PATCH 091/290] moved to private --- .../sass_extensions/functions/image_size.rb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 633242de..d3f4336a 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -5,16 +5,6 @@ module Compass::SassExtensions::Functions::ImageSize Sass::Script::Number.new(width,["px"]) end - def image_demensions(image_file) - @image_demensions ||= {} - @image_demensions[image_file.value] ||= ImageProperties.new(image_path(image_file.value)).size - end - - def image_path(image_file) - return image_file if File.exists?(image_file) - real_path(image_file) - end - # Returns the height of the image relative to the images directory def image_height(image_file) _, height = image_demensions(image_file) @@ -54,6 +44,16 @@ module Compass::SassExtensions::Functions::ImageSize private + def image_demensions(image_file) + @image_demensions ||= {} + @image_demensions[image_file.value] ||= ImageProperties.new(image_path(image_file.value)).size + end + + def image_path(image_file) + return image_file if File.exists?(image_file) + real_path(image_file) + end + def real_path(image_file) # Compute the real path to the image on the file stystem if the images_dir is set. if Compass.configuration.images_path From 91aaa29df845181b64e9053e421617da1706c027 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:30:23 -0400 Subject: [PATCH 092/290] monkey patch to rails 3.1 image functions --- .../rails/actionpack31/helpers.rb | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index 633620a3..4c7998ca 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -3,3 +3,24 @@ module Sass::Script::Functions asset_url(path, Sass::Script::String.new("image")) end end + + +module Compass::RailsImageFuctionPatch + private + + def image_path(image_file) + if file = Rails.application.assets.find_asset(image_file) + return file + end + super(image_file) + end +end + +module Sass::Script::Functions + include Compass::RailsImageFuctionPatch +end + +# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? +class Sass::Script::Functions::EvaluationContext + include Sass::Script::Functions +end \ No newline at end of file From 2792ea3be4746b4f443b4ffdff213c28dee673ff Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:31:31 -0400 Subject: [PATCH 093/290] prefix with :: just incase --- lib/compass/app_integration/rails/actionpack31/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index 4c7998ca..f03ec796 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -9,7 +9,7 @@ module Compass::RailsImageFuctionPatch private def image_path(image_file) - if file = Rails.application.assets.find_asset(image_file) + if file = ::Rails.application.assets.find_asset(image_file) return file end super(image_file) From 2367b9b9be36e161cb577c8d920e1e1bba0ffb88 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:38:36 -0400 Subject: [PATCH 094/290] dont cache --- lib/compass/sass_extensions/functions/image_size.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index d3f4336a..a2ff7420 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -45,8 +45,7 @@ module Compass::SassExtensions::Functions::ImageSize private def image_demensions(image_file) - @image_demensions ||= {} - @image_demensions[image_file.value] ||= ImageProperties.new(image_path(image_file.value)).size + ImageProperties.new(image_path(image_file.value)).size end def image_path(image_file) From 45b19df315f9e09552a045961089649806f84b29 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:42:12 -0400 Subject: [PATCH 095/290] cache the image dimensions in sass options --- lib/compass/sass_extensions/functions/image_size.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index a2ff7420..65989254 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -45,7 +45,10 @@ module Compass::SassExtensions::Functions::ImageSize private def image_demensions(image_file) - ImageProperties.new(image_path(image_file.value)).size + options[:custom] ||= {} + options[:custom][:compass] ||= {} + options[:custom][:compass][:image_dimensions] ||= {} + options[:custom][:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path(image_file.value)).size end def image_path(image_file) From ec90cf515fe9c5bddeda815b7abff2ed171f0aa9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:44:49 -0400 Subject: [PATCH 096/290] fixed typo =( --- lib/compass/app_integration/rails/actionpack31/helpers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index f03ec796..2728462f 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -5,7 +5,7 @@ module Sass::Script::Functions end -module Compass::RailsImageFuctionPatch +module Compass::RailsImageFunctionPatch private def image_path(image_file) @@ -17,7 +17,7 @@ module Compass::RailsImageFuctionPatch end module Sass::Script::Functions - include Compass::RailsImageFuctionPatch + include Compass::RailsImageFunctionPatch end # Wierd that this has to be re-included to pick up sub-modules. Ruby bug? From 3e5b3cfbf6644661ba399f09588542a1d736d9b5 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Sep 2011 16:47:10 -0400 Subject: [PATCH 097/290] dont cache in custom --- lib/compass/sass_extensions/functions/image_size.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 65989254..43fea1ec 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -45,10 +45,9 @@ module Compass::SassExtensions::Functions::ImageSize private def image_demensions(image_file) - options[:custom] ||= {} - options[:custom][:compass] ||= {} - options[:custom][:compass][:image_dimensions] ||= {} - options[:custom][:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path(image_file.value)).size + options[:compass] ||= {} + options[:compass][:image_dimensions] ||= {} + options[:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path(image_file.value)).size end def image_path(image_file) From f0f4ac9700d1025e60f009e244c40a7729ad985e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 12 Sep 2011 20:34:13 -0400 Subject: [PATCH 098/290] Revert "removed useless unit" This reverts commit a8ff39a8e486352d1dc232dc419d78f3e8a1d7d8. This commit was breaking tests --- .../compass/stylesheets/compass/typography/lists/_bullets.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss b/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss index 958eefc0..aabe802a 100644 --- a/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss +++ b/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss @@ -2,7 +2,7 @@ @mixin no-bullet { list-style-image : none; list-style-type : none; - margin-left : 0; + margin-left : 0px; } // turns off the bullets for an entire list From 35b9b60c7c0d618c0d21456955cdb7481a49dc8d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 12 Sep 2011 20:44:12 -0400 Subject: [PATCH 099/290] Sprite importer now passes the correct filename to the sass engine which was causeing unexpected uris to get returned This fixes the 'to_tree' error that wasn't really a sass bug it was an error on the sprite importers part --- lib/compass/sprite_importer.rb | 8 ++++---- test/units/sprites/importer_test.rb | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index e2a775d2..589f36e5 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -19,7 +19,7 @@ module Compass end def find_relative(uri, base, options) - find(File.join(base, uri), options) + nil end def to_s @@ -85,13 +85,13 @@ module Compass end # Returns the sass_options for this sprite - def self.sass_options(name, importer, options) - options.merge!(:filename => name, :syntax => :scss, :importer => importer) + def self.sass_options(uri, importer, options) + options.merge!(:filename => uri, :syntax => :scss, :importer => importer) end # Returns a Sass::Engine for this sprite object def self.sass_engine(uri, name, importer, options) - Sass::Engine.new(content_for_images(uri, name, options[:skip_overrides]), sass_options(name, importer, options)) + Sass::Engine.new(content_for_images(uri, name, options[:skip_overrides]), sass_options(uri, importer, options)) end # Generates the Sass for this sprite file diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index a726a413..e4030017 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -68,6 +68,12 @@ class ImporterTest < Test::Unit::TestCase assert_equal 'bar', opts[:foo] end + test "verify that the sass_engine passes the correct filename" do + importer = Compass::SpriteImporter.new + engine = Compass::SpriteImporter.sass_engine(URI, 'foo', importer, options) + assert_equal engine.options[:filename], URI + end + test "should fail given bad sprite extensions" do @images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images') file = StringIO.new("images_path = #{@images_src_path.inspect}\n") From e52184b6feb31298efa9dd93a6057d61185dc4f5 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 14 Sep 2011 12:47:20 -0400 Subject: [PATCH 100/290] fixes #551 with failing test --- lib/compass/sass_extensions/sprites/sprite_map.rb | 2 +- test/test_helper.rb | 8 ++++---- test/units/sprites/sprite_map_test.rb | 6 ++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index e8c2e2e8..3ea296c1 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -14,7 +14,7 @@ module Compass # the path is relative to the images_path confguration option def self.from_uri(uri, context, kwargs) uri = uri.value - name, path = Compass::SpriteImporter.path_and_name(uri) + path, name = Compass::SpriteImporter.path_and_name(uri) files = Compass::SpriteImporter.files(uri) sprites = files.map do |sprite| relative_name(sprite) diff --git a/test/test_helper.rb b/test/test_helper.rb index 43981842..de3fa125 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -44,11 +44,11 @@ module SpriteHelper @images_tmp_path = File.join(File.dirname(__FILE__), 'fixtures', 'sprites', 'public', 'images-tmp') end - def sprite_map_test(options) + def sprite_map_test(options, uri = URI) importer = Compass::SpriteImporter.new - path, name = Compass::SpriteImporter.path_and_name(URI) - sprite_names = Compass::SpriteImporter.sprite_names(URI) - sass_engine = Compass::SpriteImporter.sass_engine(URI, name, importer, options) + path, name = Compass::SpriteImporter.path_and_name(uri) + sprite_names = Compass::SpriteImporter.sprite_names(uri) + sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options) end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 4adb7622..a70157fc 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -192,5 +192,11 @@ class SpriteMapTest < Test::Unit::TestCase FileUtils.rm_rf other_folder end + test "should create map for nested" do + base = Compass::SassExtensions::Sprites::SpriteMap.from_uri OpenStruct.new(:value => 'nested/squares/*.png'), @base.instance_variable_get(:@evaluation_context), @options + assert_equal 'squares', base.name + assert_equal 'nested/squares', base.path + end + end \ No newline at end of file From 660c5697db791f7269c1d9f5c15a51285cba86a9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 15 Sep 2011 11:25:57 -0400 Subject: [PATCH 101/290] image_size was causing issue with rails and the sass evaluation context --- lib/compass/sass_extensions/functions/image_size.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 43fea1ec..2a804930 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -47,11 +47,13 @@ private def image_demensions(image_file) options[:compass] ||= {} options[:compass][:image_dimensions] ||= {} - options[:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path(image_file.value)).size + options[:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path_for_size(image_file.value)).size end - def image_path(image_file) - return image_file if File.exists?(image_file) + def image_path_for_size(image_file) + if File.exists?(image_file) + return image_file + end real_path(image_file) end From 9d48b2539ce191fe2f112ebe0864d0a81691a447 Mon Sep 17 00:00:00 2001 From: Beau Smith Date: Fri, 13 May 2011 12:46:19 -0700 Subject: [PATCH 102/290] Fixing funny typo, abiding by the rules of using Compass. --- doc-src/content/help/tutorials/contributing.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/help/tutorials/contributing.markdown b/doc-src/content/help/tutorials/contributing.markdown index 0a4f1696..05cb1e4a 100644 --- a/doc-src/content/help/tutorials/contributing.markdown +++ b/doc-src/content/help/tutorials/contributing.markdown @@ -13,7 +13,7 @@ as we can for you to contribute changes to compass -- So if there's something he seems harder than it aught to be, please let us know. If you find a bug **in this document**, you are bound to contribute a fix. Stop reading now -if you do not wish to abide by this rool. +if you do not wish to abide by this rule. **Step 1**: If you do not have a github account, create one. From 9d1e2c9beaab97400d8a0f13814d6a9f649d13c3 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 16 Sep 2011 15:19:57 -0700 Subject: [PATCH 103/290] Update changelog --- doc-src/content/CHANGELOG.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index de64e3d6..be157ac4 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,8 +14,14 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.alpha.1 (UNRELEASED) +------------------------- + +* font-files helper: Stop requiring font type when the type can be guessed from URL + + 0.12.alpha.0 (8/30/2011) --------------------------- +------------------------ * Support for the rails 3.1 asset pipeline * Added support for diagonal, horizontal, and smart sprite layout * Fixed a bug with spacing in horizontal layout From 493f01c2c2f119ad5e5e01eeb60786d2235a95c0 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 16 Sep 2011 16:02:02 -0700 Subject: [PATCH 104/290] Update changelog --- doc-src/content/CHANGELOG.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index be157ac4..92b80b26 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -18,6 +18,8 @@ The Documentation for the [latest preview release](http://beta.compass-style.org ------------------------- * font-files helper: Stop requiring font type when the type can be guessed from URL +* inline-font-files: actually works now +* Upgrade CSS3 Pie to 1.0beta5 0.12.alpha.0 (8/30/2011) From 77321fdb8059e4710939a639cbc471daa4eb1efc Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 16 Sep 2011 17:47:08 -0700 Subject: [PATCH 105/290] Revert "Revert "removed useless unit"" This reverts commit f0f4ac9700d1025e60f009e244c40a7729ad985e. --- .../compass/stylesheets/compass/typography/lists/_bullets.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss b/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss index aabe802a..958eefc0 100644 --- a/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss +++ b/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss @@ -2,7 +2,7 @@ @mixin no-bullet { list-style-image : none; list-style-type : none; - margin-left : 0px; + margin-left : 0; } // turns off the bullets for an entire list From 87377ad7ff9a3214764b01fa37467a986d46773a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 16 Sep 2011 17:59:11 -0700 Subject: [PATCH 106/290] slightly better error message --- test/integrations/compass_test.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/integrations/compass_test.rb b/test/integrations/compass_test.rb index b505debb..61ad91c2 100644 --- a/test/integrations/compass_test.rb +++ b/test/integrations/compass_test.rb @@ -125,11 +125,10 @@ private expected_lines.gsub!(/^@charset[^;]+;/,'') if options[:ignore_charset] expected_lines = expected_lines.split("\n").reject{|l| l=~/\A\Z/} expected_lines.zip(actual_lines).each_with_index do |pair, line| - message = "template: #{name}\nline: #{line + 1}" if pair.first == pair.last assert(true) else - assert false, diff_as_string(pair.first.inspect, pair.last.inspect) + assert false, "Error in #{result_path(@current_project)}/#{name}.css:#{line + 1}\n"+diff_as_string(pair.first.inspect, pair.last.inspect) end end if expected_lines.size < actual_lines.size From d7a579ce58875a08d07c1cf0cb3bc337ede9e094 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 16 Sep 2011 18:00:00 -0700 Subject: [PATCH 107/290] Fix broken tests. --- test/fixtures/stylesheets/compass/css/lists.css | 14 +++++++------- test/fixtures/stylesheets/compass/css/reset.css | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/test/fixtures/stylesheets/compass/css/lists.css b/test/fixtures/stylesheets/compass/css/lists.css index 8e7b1a58..130d3041 100644 --- a/test/fixtures/stylesheets/compass/css/lists.css +++ b/test/fixtures/stylesheets/compass/css/lists.css @@ -7,7 +7,7 @@ ul.horizontal { ul.horizontal li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; white-space: nowrap; display: inline; float: left; @@ -29,7 +29,7 @@ ul.wide-horizontal { ul.wide-horizontal li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; white-space: nowrap; display: inline; float: left; @@ -51,7 +51,7 @@ ul.right-horizontal { ul.right-horizontal li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; white-space: nowrap; display: inline; float: right; @@ -73,7 +73,7 @@ ul.no-padding { ul.no-padding li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; white-space: nowrap; display: inline; float: left; } @@ -87,7 +87,7 @@ ul.inline-block { ul.inline-block li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; @@ -106,7 +106,7 @@ ul.wide-inline-block { ul.wide-inline-block li { list-style-image: none; list-style-type: none; - margin-left: 0px; + margin-left: 0; display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; @@ -143,7 +143,7 @@ ul.no-bullets { ul.no-bullets li { list-style-image: none; list-style-type: none; - margin-left: 0px; } + margin-left: 0; } ul.pretty { margin-left: 0; } diff --git a/test/fixtures/stylesheets/compass/css/reset.css b/test/fixtures/stylesheets/compass/css/reset.css index dd912b3e..388217c4 100644 --- a/test/fixtures/stylesheets/compass/css/reset.css +++ b/test/fixtures/stylesheets/compass/css/reset.css @@ -50,7 +50,6 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, body.registered a.registered-only, body.registered abbr.registered-only, body.registered acronym.registered-only, body.registered audio.registered-only, body.registered b.registered-only, body.registered basefont.registered-only, body.registered bdo.registered-only, body.registered big.registered-only, body.registered br.registered-only, body.registered canvas.registered-only, body.registered cite.registered-only, body.registered code.registered-only, body.registered command.registered-only, body.registered datalist.registered-only, body.registered dfn.registered-only, body.registered em.registered-only, body.registered embed.registered-only, body.registered font.registered-only, body.registered i.registered-only, body.registered img.registered-only, body.registered input.registered-only, body.registered keygen.registered-only, body.registered kbd.registered-only, body.registered label.registered-only, body.registered mark.registered-only, body.registered meter.registered-only, body.registered output.registered-only, body.registered progress.registered-only, body.registered q.registered-only, body.registered rp.registered-only, body.registered rt.registered-only, body.registered ruby.registered-only, body.registered s.registered-only, body.registered samp.registered-only, body.registered select.registered-only, body.registered small.registered-only, body.registered span.registered-only, body.registered strike.registered-only, body.registered strong.registered-only, body.registered sub.registered-only, body.registered sup.registered-only, body.registered textarea.registered-only, body.registered time.registered-only, body.registered tt.registered-only, body.registered u.registered-only, body.registered var.registered-only, body.registered video.registered-only, body.registered wbr.registered-only { display: inline; } - body.registered address.registered-only, body.registered article.registered-only, body.registered aside.registered-only, body.registered blockquote.registered-only, body.registered center.registered-only, body.registered dir.registered-only, body.registered div.registered-only, body.registered dd.registered-only, body.registered details.registered-only, body.registered dl.registered-only, body.registered dt.registered-only, body.registered fieldset.registered-only, body.registered figcaption.registered-only, body.registered figure.registered-only, body.registered form.registered-only, body.registered footer.registered-only, body.registered frameset.registered-only, body.registered h1.registered-only, body.registered h2.registered-only, body.registered h3.registered-only, body.registered h4.registered-only, body.registered h5.registered-only, body.registered h6.registered-only, body.registered hr.registered-only, body.registered header.registered-only, body.registered hgroup.registered-only, body.registered isindex.registered-only, body.registered menu.registered-only, body.registered nav.registered-only, body.registered noframes.registered-only, body.registered noscript.registered-only, body.registered ol.registered-only, body.registered p.registered-only, body.registered pre.registered-only, body.registered section.registered-only, body.registered summary.registered-only, body.registered ul.registered-only { display: block; } From 6cba5520aa0cf196cfbec456f735050eefdf9ffd Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 17 Sep 2011 00:45:35 -0400 Subject: [PATCH 108/290] fixed issue with showing positions and made the internal api consistant with the documentation --- lib/compass/sass_extensions/sprites/image.rb | 10 +++++----- lib/compass/sprite_importer.rb | 6 +++--- test/units/sprites/image_test.rb | 6 +++--- test/units/sprites/sprite_map_test.rb | 9 +++++++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/image.rb b/lib/compass/sass_extensions/sprites/image.rb index 1b41b18f..9ea024e4 100644 --- a/lib/compass/sass_extensions/sprites/image.rb +++ b/lib/compass/sass_extensions/sprites/image.rb @@ -49,27 +49,27 @@ module Compass end def get_var_file(var) - options.get_var "#{name}_#{var}" + options.get_var "#{base.name}_#{name}_#{var}" end # Value of $#{name}-repeat or $repeat def repeat - (get_var_file("repeat") || options.get_var("repeat") || Sass::Script::String.new("no-repeat")).value + @repeat ||= (get_var_file("repeat") || options.get_var("repeat") || Sass::Script::String.new("no-repeat")).value end # Value of $#{name}-position or $position defaults to 0px def position - get_var_file("position") || options.get_var("position") || Sass::Script::Number.new(0, ["px"]) + @position||= get_var_file("position") || options.get_var("position") || Sass::Script::Number.new(0, ["px"]) end # Offset within the sprite def offset - (position.unitless? || position.unit_str == "px") ? position.value : 0 + @offset ||= (position.unitless? || position.unit_str == "px") ? position.value : 0 end # Spacing between this image and the next def spacing - (get_var_file("spacing") || options.get_var("spacing") || Sass::Script::Number.new(0, ['px'])).value + @spacing ||= (get_var_file("spacing") || options.get_var("spacing") || Sass::Script::Number.new(0, ['px'])).value end # MD5 hash of this file diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 589f36e5..9262ac08 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -167,9 +167,9 @@ $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default; content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$layout: $#{name}-layout, \n$cleanup: $#{name}-clean-up,\n" content += sprites.map do |sprite_name| -%Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position, - $#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing, - $#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat} +%Q{ $#{name}-#{sprite_name}-position: $#{name}-#{sprite_name}-position, + $#{name}-#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing, + $#{name}-#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat} end.join(",\n") content += ");" end diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index ffac255d..823fb0e6 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -52,7 +52,7 @@ class SpritesImageTest < Test::Unit::TestCase end test 'image type is "global"' do - image = test_image "ten_by_ten_repeat" => Sass::Script::String.new('global') + image = test_image "selectors_ten_by_ten_repeat" => Sass::Script::String.new('global') assert_equal 'global', image.repeat end @@ -61,7 +61,7 @@ class SpritesImageTest < Test::Unit::TestCase end test 'image position' do - image = test_image "ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) + image = test_image "selectors_ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) assert_equal 100, image.position.value end @@ -72,7 +72,7 @@ class SpritesImageTest < Test::Unit::TestCase end test 'offset' do - image = test_image "ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) + image = test_image "selectors_ten_by_ten_position" => Sass::Script::Number.new(100, ["px"]) assert_equal 100, image.offset end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index a70157fc..ff72467b 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -92,7 +92,7 @@ class SpriteMapTest < Test::Unit::TestCase end it "should layout vertical with position" do - base = sprite_map_test("ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + base = sprite_map_test("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) assert_equal [0, 10, 0, 0], base.images.map(&:left) end @@ -158,7 +158,7 @@ class SpriteMapTest < Test::Unit::TestCase end it "should layout horizontaly with position" do - base = horizontal("ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + base = horizontal("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) assert_equal [0, 10, 0, 0], base.images.map(&:top) end @@ -198,5 +198,10 @@ class SpriteMapTest < Test::Unit::TestCase assert_equal 'nested/squares', base.path end + test "should have correct position on ten-by-ten" do + percent = Sass::Script::Number.new(50, ['%']) + base = sprite_map_test(@options.merge('selectors_ten_by_ten_position' => percent)) + assert_equal percent, base.image_for('ten-by-ten').position + end end \ No newline at end of file From fe4edff7d4980b50ae377336cf8ccfbc284bfaaa Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 17 Sep 2011 07:44:20 -0700 Subject: [PATCH 109/290] Workaround for the deprecated static_root --- .../app_integration/rails/actionpack31/railtie.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb index b26ef6e7..69bb40b6 100644 --- a/lib/compass/app_integration/rails/actionpack31/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack31/railtie.rb @@ -61,13 +61,11 @@ class Rails::Railtie::Configuration # Force the asset into the cache so find_asset will find it. cached_assets = Rails.application.assets.instance_variable_get("@assets") cached_assets[logical_path] = cached_assets[filename] = asset - if File.directory?(Rails.application.assets.static_root) - # Copy the asset into the static root so the browsers will find it. - asset_attributes = Rails.application.assets.attributes_for(logical_path) - digest_path = asset_attributes.path_with_fingerprint(asset.digest) - static_path = Rails.application.assets.static_root.join(digest_path) - asset.write_to(static_path) - end + + target = Pathname.new(File.join(Rails.public_path, Rails.application.config.assets.prefix)) + asset = Rails.application.assets.find_asset(logical_path) + filename = target.join(asset.digest_path) + asset.write_to(filename) end end data @@ -86,4 +84,4 @@ module Compass Compass.configure_rails!(app) end end -end \ No newline at end of file +end From c9593794bdfab5f7ce5edecd8d12f988c3741450 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Sat, 17 Sep 2011 12:02:51 -0400 Subject: [PATCH 110/290] better sorting of images coming into sprites, fixes one rbx error --- lib/compass/sass_extensions/sprites/row_fitter.rb | 8 +++++++- test/units/sprites/sprite_map_test.rb | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/row_fitter.rb b/lib/compass/sass_extensions/sprites/row_fitter.rb index b5afff0f..834c57fa 100644 --- a/lib/compass/sass_extensions/sprites/row_fitter.rb +++ b/lib/compass/sass_extensions/sprites/row_fitter.rb @@ -10,7 +10,13 @@ module Compass def_delegators :rows, :[] def initialize(images) - @images = images.sort {|a,b| a.height <=> b.height } + @images = images.sort do |a,b| + if a.height == b.height + b.width <=> a.width + else + a.height <=> b.height + end + end @rows = [] end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index ff72467b..9f869d4b 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -111,7 +111,7 @@ class SpriteMapTest < Test::Unit::TestCase base.generate assert_equal 400, base.width assert_equal 60, base.height - assert_equal [[0, 0], [20, 120], [20, 20], [20, 0], [20, 160]], base.images.map {|i| [i.top, i.left]} + assert_equal [[0, 0], [20, 120], [20, 0], [20, 100], [20, 160]], base.images.map {|i| [i.top, i.left]} assert File.exists?(base.filename) FileUtils.rm base.filename end From 5fd2c14d060ec5b839ce77f767f4ce8b9b23a11a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 17 Sep 2011 07:44:49 -0700 Subject: [PATCH 111/290] A better setting to check if we are precompiling --- lib/compass/app_integration/rails/actionpack31/railtie.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb index 69bb40b6..041cf60a 100644 --- a/lib/compass/app_integration/rails/actionpack31/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack31/railtie.rb @@ -54,7 +54,7 @@ class Rails::Railtie::Configuration # hash or some metadata that is opaque to sprockets that could be read from the # asset's attributes, we could avoid cluttering the assets directory with generated # sprites and always just use the logical_path + data version of the api. - if Rails.application.config.action_controller.perform_caching + if Rails.application.config.assets.digests.try(:any?) asset = Rails.application.assets.find_asset(filename) pathname = Pathname.new(filename) logical_path = filename[(Compass.configuration.generated_images_path.length+1)..-1] From cd907d17a701887256561f8526b8b50c0dfb43fd Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 07:28:29 -0700 Subject: [PATCH 112/290] Log the creation or unchanged status of sprites during compilation. --- lib/compass/compiler.rb | 2 ++ lib/compass/sass_extensions/functions/sprites.rb | 2 +- lib/compass/sass_extensions/sprites/sprite_methods.rb | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index 11759e26..a1006c21 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -15,6 +15,8 @@ module Compass self.sass_options.update(sass_opts) self.sass_options[:cache_location] ||= determine_cache_location self.sass_options[:importer] = self.importer = Sass::Importers::Filesystem.new(from) + self.sass_options[:compass] ||= {} + self.sass_options[:compass][:logger] = self.logger self.staleness_checker = Sass::Plugin::StalenessChecker.new(sass_options) end diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index e4df7c49..da193f8e 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -68,7 +68,7 @@ module Compass::SassExtensions::Functions::Sprites end Sass::Script::Functions.declare :sprite_file, [:map, :sprite] - # Returns voolean if sprite has a parent + # Returns boolean if sprite has a parent def sprite_does_not_have_parent(map, sprite) sprite = convert_sprite_name(sprite) verify_map map diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index d07b3d05..3dddbe51 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -46,6 +46,10 @@ module Compass File.join(Compass.configuration.generated_images_path, "#{path}-s#{uniqueness_hash}.png") end + def relativize(path) + Pathname.new(path).relative_path_from(Pathname.new(Dir.pwd)).to_s + end + # Generate a sprite image if necessary def generate if generation_required? @@ -55,11 +59,14 @@ module Compass engine.construct_sprite Compass.configuration.run_sprite_generated(engine.canvas) save! + else + options[:compass][:logger].record(:unchanged, relativize(filename)) end end def cleanup_old_sprites Dir[File.join(Compass.configuration.images_path, "#{path}-*.png")].each do |file| + options[:compass][:logger].record(:remove, relativize(file)) FileUtils.rm file end end @@ -89,6 +96,7 @@ module Compass def save! FileUtils.mkdir_p(File.dirname(filename)) saved = engine.save(filename) + options[:compass][:logger].record(:create, relativize(filename)) Compass.configuration.run_sprite_saved(filename) saved end From 8b3347122931dcf688ac7d58f8bd9ceb9ccfeb26 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 07:39:32 -0700 Subject: [PATCH 113/290] Bump sprite version for this release. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 3dddbe51..437137a6 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -5,7 +5,7 @@ module Compass # Changing this string will invalidate all previously generated sprite images. # We should do so only when the packing algorithm changes - SPRITE_VERSION = "1" + SPRITE_VERSION = "2" # Calculates the overal image dimensions # collects image sizes and input parameters for each sprite From ce853df6bf98665b8a370a78222e0c3380bae0b0 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 07:40:29 -0700 Subject: [PATCH 114/290] In some cases changing the layout doesn't force the sprite hash to change, so we have to make the layout part of the hash. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 437137a6..b15477da 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -82,6 +82,7 @@ module Compass sum = Digest::MD5.new sum << SPRITE_VERSION sum << path + sum << layout images.each do |image| [:relative_file, :height, :width, :repeat, :spacing, :position, :digest].each do |attr| sum << image.send(attr).to_s From de029babb583952a50e4ade43559cd40f868c14a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 07:29:00 -0700 Subject: [PATCH 115/290] Slightly prettier output during sprite file generation. --- lib/compass/sprite_importer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 9262ac08..9b844027 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -108,7 +108,7 @@ $#{name}-spacing: 0 !default; $#{name}-repeat: no-repeat !default; $#{name}-prefix: '' !default; $#{name}-clean-up: true !default; -$#{name}-layout:vertical !default; +$#{name}-layout: vertical !default; #{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $layout: $#{name}-layout, $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) } @@ -165,7 +165,7 @@ $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default; SCSS end.join - content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$layout: $#{name}-layout, \n$cleanup: $#{name}-clean-up,\n" + content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n $layout: $#{name}-layout, \n $cleanup: $#{name}-clean-up,\n" content += sprites.map do |sprite_name| %Q{ $#{name}-#{sprite_name}-position: $#{name}-#{sprite_name}-position, $#{name}-#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing, From b5ca89425deb6933e3d62ca531b12b4b384c8d38 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 07:40:44 -0700 Subject: [PATCH 116/290] code cleanup --- lib/compass/actions.rb | 1 - lib/compass/sprite_importer.rb | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compass/actions.rb b/lib/compass/actions.rb index 288e3370..78a6fcf4 100644 --- a/lib/compass/actions.rb +++ b/lib/compass/actions.rb @@ -107,6 +107,5 @@ module Compass logger.record(action, file, options[:extra].to_s) end end - end end diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 9b844027..442cbbc0 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -91,7 +91,8 @@ module Compass # Returns a Sass::Engine for this sprite object def self.sass_engine(uri, name, importer, options) - Sass::Engine.new(content_for_images(uri, name, options[:skip_overrides]), sass_options(uri, importer, options)) + content = content_for_images(uri, name, options[:skip_overrides]) + Sass::Engine.new(content, sass_options(uri, importer, options)) end # Generates the Sass for this sprite file From bfcff75c32be16275dffe0854ef99734b3fe2061 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 09:03:02 -0700 Subject: [PATCH 117/290] Handle the case where the there is not relative path to the images directory. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index b15477da..bd905247 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -47,7 +47,7 @@ module Compass end def relativize(path) - Pathname.new(path).relative_path_from(Pathname.new(Dir.pwd)).to_s + Pathname.new(path).relative_path_from(Pathname.new(Dir.pwd)).to_s rescue path end # Generate a sprite image if necessary From 942a84dca07ded701b1d37682e0abe084fed116a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 09:03:17 -0700 Subject: [PATCH 118/290] Tests need a logger. --- test/integrations/sprites_test.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index e099bc05..fa865e95 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -49,6 +49,8 @@ class SpritesTest < Test::Unit::TestCase options[:line_comments] = false options[:style] = :expanded options[:syntax] = :scss + options[:compass] ||= {} + options[:compass][:logger] ||= Compass::NullLogger.new css = Sass::Engine.new(scss, options).render # reformat to fit result of heredoc: " #{css.gsub('@charset "UTF-8";', '').gsub(/\n/, "\n ").strip}\n" From c217edeed9da1d46d59d36e01d1659ad2e02d163 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 11:04:35 -0700 Subject: [PATCH 119/290] Fix broken tests --- .../stylesheets/compass/css/sprites.css | 2 +- ...g-s8c3c755a68.png => flag-s8f1e8fdb9b.png} | Bin test/integrations/sprites_test.rb | 48 +++++++++--------- test/test_helper.rb | 4 +- test/units/sprites/sprite_map_test.rb | 6 ++- 5 files changed, 32 insertions(+), 28 deletions(-) rename test/fixtures/stylesheets/compass/images/{flag-s8c3c755a68.png => flag-s8f1e8fdb9b.png} (100%) diff --git a/test/fixtures/stylesheets/compass/css/sprites.css b/test/fixtures/stylesheets/compass/css/sprites.css index 3fc49c14..a7461fa8 100644 --- a/test/fixtures/stylesheets/compass/css/sprites.css +++ b/test/fixtures/stylesheets/compass/css/sprites.css @@ -1,5 +1,5 @@ .flag-sprite, #flags .us, #flags .au, #flags .ca, #flags .es, #flags .eg, #flags .ly, .flag-ad, .flag-ae, .flag-af, .flag-ag, .flag-ai, .flag-al, .flag-am, .flag-an, .flag-ao, .flag-ar, .flag-as, .flag-at, .flag-au, .flag-aw, .flag-ax, .flag-az, .flag-ba, .flag-bb, .flag-bd, .flag-be, .flag-bf, .flag-bg, .flag-bh, .flag-bi, .flag-bj, .flag-bm, .flag-bn, .flag-bo, .flag-br, .flag-bs, .flag-bt, .flag-bv, .flag-bw, .flag-by, .flag-bz, .flag-ca, .flag-catalonia, .flag-cc, .flag-cd, .flag-cf, .flag-cg, .flag-ch, .flag-ci, .flag-ck, .flag-cl, .flag-cm, .flag-cn, .flag-co, .flag-cr, .flag-cs, .flag-cu, .flag-cv, .flag-cx, .flag-cy, .flag-cz, .flag-de, .flag-dj, .flag-dk, .flag-dm, .flag-do, .flag-dz, .flag-ec, .flag-ee, .flag-eg, .flag-eh, .flag-england, .flag-er, .flag-es, .flag-et, .flag-europeanunion, .flag-fam, .flag-fi, .flag-fj, .flag-fk, .flag-fm, .flag-fo, .flag-fr, .flag-ga, .flag-gb, .flag-gd, .flag-ge, .flag-gf, .flag-gh, .flag-gi, .flag-gl, .flag-gm, .flag-gn, .flag-gp, .flag-gq, .flag-gr, .flag-gs, .flag-gt, .flag-gu, .flag-gw, .flag-gy, .flag-hk, .flag-hm, .flag-hn, .flag-hr, .flag-ht, .flag-hu, .flag-id-2, .flag-ie, .flag-il, .flag-in, .flag-io, .flag-iq, .flag-ir, .flag-is, .flag-it, .flag-jm, .flag-jo, .flag-jp, .flag-ke, .flag-kg, .flag-kh, .flag-ki, .flag-km, .flag-kn, .flag-kp, .flag-kr, .flag-kw, .flag-ky, .flag-kz, .flag-la, .flag-lb, .flag-lc, .flag-li, .flag-lk, .flag-lr, .flag-ls, .flag-lt, .flag-lu, .flag-lv, .flag-ly, .flag-ma, .flag-mc, .flag-md, .flag-me, .flag-mg, .flag-mh, .flag-mk, .flag-ml, .flag-mm, .flag-mn, .flag-mo, .flag-mp, .flag-mq, .flag-mr, .flag-ms, .flag-mt, .flag-mu, .flag-mv, .flag-mw, .flag-mx, .flag-my, .flag-mz, .flag-na, .flag-nc, .flag-ne, .flag-nf, .flag-ng, .flag-ni, .flag-nl, .flag-no, .flag-np, .flag-nr, .flag-nu, .flag-nz, .flag-om, .flag-pa, .flag-pe, .flag-pf, .flag-pg, .flag-ph, .flag-pk, .flag-pl, .flag-pm, .flag-pn, .flag-pr, .flag-ps, .flag-pt, .flag-pw, .flag-py, .flag-qa, .flag-re, .flag-ro, .flag-rs, .flag-ru, .flag-rw, .flag-sa, .flag-sb, .flag-sc, .flag-scotland, .flag-sd, .flag-se, .flag-sg, .flag-sh, .flag-si, .flag-sj, .flag-sk, .flag-sl, .flag-sm, .flag-sn, .flag-so, .flag-sr, .flag-st, .flag-sv, .flag-sy, .flag-sz, .flag-tc, .flag-td, .flag-tf, .flag-tg, .flag-th, .flag-tj, .flag-tk, .flag-tl, .flag-tm, .flag-tn, .flag-to, .flag-tr, .flag-tt, .flag-tv, .flag-tw, .flag-tz, .flag-ua, .flag-ug, .flag-um, .flag-us, .flag-uy, .flag-uz, .flag-va, .flag-vc, .flag-ve, .flag-vg, .flag-vi, .flag-vn, .flag-vu, .flag-wales, .flag-wf, .flag-ws, .flag-ye, .flag-yt, .flag-za, .flag-zm, .flag-zw { - background: url('/images/flag-s8c3c755a68.png') no-repeat; } + background: url('/images/flag-s8f1e8fdb9b.png') no-repeat; } #flags .us { background-position: 0 -407px; diff --git a/test/fixtures/stylesheets/compass/images/flag-s8c3c755a68.png b/test/fixtures/stylesheets/compass/images/flag-s8f1e8fdb9b.png similarity index 100% rename from test/fixtures/stylesheets/compass/images/flag-s8c3c755a68.png rename to test/fixtures/stylesheets/compass/images/flag-s8f1e8fdb9b.png diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index fa865e95..a447b3c6 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -63,7 +63,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s161c60ad78.png') no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -94,7 +94,7 @@ class SpritesTest < Test::Unit::TestCase assert_not_nil Dir.glob("#{@generated_images_tmp_path}/squares-s*.png").first assert_correct <<-CSS, css .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/images/generated/squares-s161c60ad78.png') no-repeat; + background: url('/images/generated/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -115,7 +115,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s161c60ad78.png') no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -147,7 +147,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .cubicle, .large-cube { - background: url('/squares-s161c60ad78.png') no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .cubicle { @@ -172,7 +172,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .circles { - background: url('/squares-s161c60ad78.png') no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } CSS assert_equal image_size('squares-s*.png'), [20, 30] @@ -186,7 +186,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s89450808af.png') no-repeat; + background: url('/squares-s563a5e0855.png') no-repeat; } .squares-ten-by-ten { @@ -208,7 +208,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s673837183a.png') no-repeat; + background: url('/squares-s4ea353fa6d.png') no-repeat; } .squares-ten-by-ten { @@ -231,7 +231,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s1cd84c9068.png') no-repeat; + background: url('/squares-sf4771cb124.png') no-repeat; } .squares-ten-by-ten { @@ -254,7 +254,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sf25b7090ca.png') no-repeat; + background: url('/squares-sc82d6f3cf4.png') no-repeat; } .squares-ten-by-ten { @@ -276,7 +276,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sd66bf24bab.png') no-repeat; + background: url('/squares-s2f4aa65dcf.png') no-repeat; } .squares-ten-by-ten { @@ -311,7 +311,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite { - background: url('/squares-s8e490168dd.png') no-repeat; + background: url('/squares-sce5dc30797.png') no-repeat; } .adjusted-percentage { @@ -349,7 +349,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .adjusted-percentage, .adjusted-px-1, .adjusted-px-2 { - background: url('/squares-s8e490168dd.png') no-repeat; + background: url('/squares-sce5dc30797.png') no-repeat; } .adjusted-percentage { @@ -376,7 +376,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sa5550fd132.png') no-repeat; + background: url('/squares-sbab486c25a.png') no-repeat; } .squares-ten-by-ten { @@ -400,7 +400,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s89a274044e.png') no-repeat; + background: url('/squares-sb9d9a8ca6a.png') no-repeat; } .squares-ten-by-ten { @@ -449,7 +449,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares { - background: url('/squares-s145869726f.png') 0 -10px no-repeat; + background: url('/squares-sd817b59156.png') 0 -10px no-repeat; } CSS end @@ -468,7 +468,7 @@ class SpritesTest < Test::Unit::TestCase assert_equal image_size('squares-s*.png'), [20, 40] assert_correct css, <<-CSS .squares-sprite { - background: url('/squares-se3c68372d9.png') no-repeat; + background: url('/squares-s555875d730.png') no-repeat; } .foo { @@ -488,7 +488,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-sedfef809e2.png') no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } .selectors-ten-by-ten { @@ -513,7 +513,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-sedfef809e2.png') no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } .selectors-ten-by-ten { @@ -540,7 +540,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-sedfef809e2.png') no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -569,7 +569,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-sedfef809e2.png') no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -587,7 +587,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-sedfef809e2.png') no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -624,7 +624,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .ko-sprite, .ko-default_background, .ko-starbg26x27 { - background: url('/ko-scc3f80660d.png') no-repeat; + background: url('/ko-sd6b4d44430.png') no-repeat; } .ko-default_background { @@ -681,7 +681,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .nested-sprite, .nested-ten-by-ten { - background: url('/nested-s55a8935544.png') no-repeat; + background: url('/nested-s7b93e0b6bf.png') no-repeat; } .nested-ten-by-ten { @@ -704,7 +704,7 @@ class SpritesTest < Test::Unit::TestCase assert_equal [30, 20], image_size('squares-s*.png') other_css = <<-CSS .squares-sprite { - background: url('/squares-s161c60ad78.png') no-repeat; + background: url('/squares-s4bd95c5c56.png') no-repeat; } .foo { diff --git a/test/test_helper.rb b/test/test_helper.rb index de3fa125..ccae6160 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -49,7 +49,9 @@ module SpriteHelper path, name = Compass::SpriteImporter.path_and_name(uri) sprite_names = Compass::SpriteImporter.sprite_names(uri) sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) - Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options) + map = Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options) + map.options = {:compass => {:logger => Compass::NullLogger.new}} + map end def create_sprite_temp diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index ff72467b..5f1e8025 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -35,7 +35,7 @@ class SpriteMapTest < Test::Unit::TestCase end test 'uniqueness_hash' do - assert_equal 'ef52c5c63a', @base.uniqueness_hash + assert_equal '4c703bbc05', @base.uniqueness_hash end it 'should be outdated' do @@ -103,7 +103,9 @@ class SpriteMapTest < Test::Unit::TestCase path, name = Compass::SpriteImporter.path_and_name(uri) sprite_names = Compass::SpriteImporter.sprite_names(uri) sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) - Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map {|n| "image_row/#{n}.png"}, path, name, sass_engine, options) + map = Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map {|n| "image_row/#{n}.png"}, path, name, sass_engine, options) + map.options = {:compass => {:logger => Compass::NullLogger.new}} + map end it "should have a smart layout" do From 1b3e7a3a6bb4c351ae3c0079147b95a037028f7b Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 12:44:54 -0700 Subject: [PATCH 120/290] Fix failing integration test. --- features/command_line.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/command_line.feature b/features/command_line.feature index fd2b374c..ac160afc 100644 --- a/features/command_line.feature +++ b/features/command_line.feature @@ -200,7 +200,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s8c3c755a68.png | + | images/flag-s8f1e8fdb9b.png | And the following files are removed: | .sass-cache/ | | tmp/border_radius.css | @@ -208,7 +208,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s8c3c755a68.png | + | images/flag-s8f1e8fdb9b.png | Scenario: Watching a project for changes Given ruby supports fork From 28daff67713afa432ce300dfeb22f8b2aee8d7b9 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 17:59:37 -0700 Subject: [PATCH 121/290] Assert that sprite offsets are numbers. --- lib/compass/sass_extensions/functions/sprites.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index da193f8e..e6506a66 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -120,6 +120,8 @@ module Compass::SassExtensions::Functions::Sprites # # background-position: 3px -36px; def sprite_position(map, sprite = nil, offset_x = ZERO, offset_y = ZERO) + assert_type offset_x, :Number + assert_type offset_y, :Number sprite = convert_sprite_name(sprite) verify_map(map, "sprite-position") unless sprite && sprite.is_a?(Sass::Script::String) From 71e5d28a2981c276c0815f65e56d7b2fb82e3189 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 18:18:38 -0700 Subject: [PATCH 122/290] Respect the --quiet option with sprite logging --- doc-src/content/CHANGELOG.markdown | 1 + lib/compass/sass_extensions/sprites/sprite_methods.rb | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 92b80b26..458fe07a 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -20,6 +20,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * font-files helper: Stop requiring font type when the type can be guessed from URL * inline-font-files: actually works now * Upgrade CSS3 Pie to 1.0beta5 +* log sprite generation and removal to the console 0.12.alpha.0 (8/30/2011) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index bd905247..e674aae3 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -60,13 +60,13 @@ module Compass Compass.configuration.run_sprite_generated(engine.canvas) save! else - options[:compass][:logger].record(:unchanged, relativize(filename)) + options[:compass][:logger].record(:unchanged, relativize(filename)) unless options[:quiet] end end def cleanup_old_sprites Dir[File.join(Compass.configuration.images_path, "#{path}-*.png")].each do |file| - options[:compass][:logger].record(:remove, relativize(file)) + options[:compass][:logger].record(:remove, relativize(file)) unless options[:quiet] FileUtils.rm file end end @@ -97,7 +97,7 @@ module Compass def save! FileUtils.mkdir_p(File.dirname(filename)) saved = engine.save(filename) - options[:compass][:logger].record(:create, relativize(filename)) + options[:compass][:logger].record(:create, relativize(filename)) unless options[:quiet] Compass.configuration.run_sprite_saved(filename) saved end From 38e4b3a3d97d8de330b426063bc5e21fc07d818e Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 18:19:04 -0700 Subject: [PATCH 123/290] Run a callback when a sprite is removed. --- lib/compass/configuration/data.rb | 6 ++++++ lib/compass/sass_extensions/sprites/sprite_methods.rb | 1 + 2 files changed, 7 insertions(+) diff --git a/lib/compass/configuration/data.rb b/lib/compass/configuration/data.rb index 2bd3b997..45c9e0c4 100644 --- a/lib/compass/configuration/data.rb +++ b/lib/compass/configuration/data.rb @@ -38,6 +38,12 @@ module Compass define_callback :sprite_generated chained_method :run_sprite_generated + # on_sprite_removed + # yields the filename + # usage: on_sprite_removed {|filename| do_something(filename) } + define_callback :sprite_removed + chained_method :run_sprite_removed + # on_stylesheet_saved # yields the filename # usage: on_stylesheet_saved {|filename| do_something(filename) } diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index e674aae3..251b5865 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -68,6 +68,7 @@ module Compass Dir[File.join(Compass.configuration.images_path, "#{path}-*.png")].each do |file| options[:compass][:logger].record(:remove, relativize(file)) unless options[:quiet] FileUtils.rm file + Compass.configuration.run_sprite_removed(file) end end From 972c53ecb5f0423d2bffdd5a72a116651387f257 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 19 Sep 2011 18:19:42 -0700 Subject: [PATCH 124/290] Respect the --force option with sprite generation. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 251b5865..52458b00 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -74,7 +74,7 @@ module Compass # Does this sprite need to be generated def generation_required? - !File.exists?(filename) || outdated? + !File.exists?(filename) || outdated? || options[:force] end # Returns the uniqueness hash for this sprite object From d03d52990968db144483bcccea4dece826f06e3e Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 20 Sep 2011 09:36:40 -0700 Subject: [PATCH 125/290] Add a new compass-env() helper that returns the compass environment. --- doc-src/content/CHANGELOG.markdown | 1 + lib/compass/compiler.rb | 1 + lib/compass/sass_extensions/functions.rb | 6 +++-- lib/compass/sass_extensions/functions/env.rb | 5 +++++ test/integrations/compass_test.rb | 23 ++++++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 lib/compass/sass_extensions/functions/env.rb diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 458fe07a..da287628 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -21,6 +21,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * inline-font-files: actually works now * Upgrade CSS3 Pie to 1.0beta5 * log sprite generation and removal to the console +* Added a new helper function `compass-env()` that returns the current compass environment (development, production) 0.12.alpha.0 (8/30/2011) diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index a1006c21..345adb50 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -17,6 +17,7 @@ module Compass self.sass_options[:importer] = self.importer = Sass::Importers::Filesystem.new(from) self.sass_options[:compass] ||= {} self.sass_options[:compass][:logger] = self.logger + self.sass_options[:compass][:environment] = Compass.configuration.environment self.staleness_checker = Sass::Plugin::StalenessChecker.new(sass_options) end diff --git a/lib/compass/sass_extensions/functions.rb b/lib/compass/sass_extensions/functions.rb index 99cf687a..a87916d5 100644 --- a/lib/compass/sass_extensions/functions.rb +++ b/lib/compass/sass_extensions/functions.rb @@ -2,9 +2,10 @@ module Compass::SassExtensions::Functions end %w( - selectors enumerate urls display + selectors enumerate urls display inline_image image_size constants gradient_support - font_files lists colors trig sprites cross_browser_support + font_files lists colors trig + sprites env cross_browser_support ).each do |func| require "compass/sass_extensions/functions/#{func}" end @@ -24,6 +25,7 @@ module Sass::Script::Functions include Compass::SassExtensions::Functions::Trig include Compass::SassExtensions::Functions::Sprites include Compass::SassExtensions::Functions::CrossBrowserSupport + include Compass::SassExtensions::Functions::Env end # Wierd that this has to be re-included to pick up sub-modules. Ruby bug? diff --git a/lib/compass/sass_extensions/functions/env.rb b/lib/compass/sass_extensions/functions/env.rb new file mode 100644 index 00000000..ae9cd66d --- /dev/null +++ b/lib/compass/sass_extensions/functions/env.rb @@ -0,0 +1,5 @@ +module Compass::SassExtensions::Functions::Env + def compass_env + Sass::Script::String.new((options[:compass][:environment] || "development").to_s) + end +end diff --git a/test/integrations/compass_test.rb b/test/integrations/compass_test.rb index 61ad91c2..b06f1283 100644 --- a/test/integrations/compass_test.rb +++ b/test/integrations/compass_test.rb @@ -73,6 +73,28 @@ class CompassTest < Test::Unit::TestCase end end + def test_env_in_development + within_project('envtest', lambda {|c| c.environment = :development }) do |proj| + each_css_file(proj.css_path) do |css_file| + assert_no_errors css_file, 'envtest' + end + each_sass_file do |sass_file| + assert_renders_correctly sass_file, :ignore_charset => true, :environment => "development" + end + end + end + + def test_env_in_production + within_project('envtest', lambda {|c| c.environment = :production }) do |proj| + each_css_file(proj.css_path) do |css_file| + assert_no_errors css_file, 'envtest' + end + each_sass_file do |sass_file| + assert_renders_correctly sass_file, :ignore_charset => true, :environment => "production" + end + end + end + def test_busted_image_urls within_project('busted_image_urls') do |proj| each_css_file(proj.css_path) do |css_file| @@ -150,6 +172,7 @@ private if Compass.configuration.sass_path && File.exists?(Compass.configuration.sass_path) compiler = Compass::Compiler.new *args + compiler.clean! compiler.run end yield Compass.configuration if block_given? From 9b56dc61696f01df70d8513149b8142fa69fe27d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 24 Sep 2011 01:21:41 -0400 Subject: [PATCH 126/290] updated for image_size monkey patch for api change --- lib/compass/app_integration/rails/actionpack31/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index 2728462f..819e4242 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -8,7 +8,7 @@ end module Compass::RailsImageFunctionPatch private - def image_path(image_file) + def image_path_for_size(image_file) if file = ::Rails.application.assets.find_asset(image_file) return file end From fecc98219d05104a13f66be78bc2ca9d048ab369 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 26 Sep 2011 09:00:51 -0700 Subject: [PATCH 127/290] Refactor loggin within sprites Handle missing logger instance more elegantly and centralize relativizing and quiet mode checking. Closes GH-84. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 52458b00..95e5dda8 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -60,13 +60,13 @@ module Compass Compass.configuration.run_sprite_generated(engine.canvas) save! else - options[:compass][:logger].record(:unchanged, relativize(filename)) unless options[:quiet] + log :unchanged, filename end end def cleanup_old_sprites Dir[File.join(Compass.configuration.images_path, "#{path}-*.png")].each do |file| - options[:compass][:logger].record(:remove, relativize(file)) unless options[:quiet] + log :remove, file FileUtils.rm file Compass.configuration.run_sprite_removed(file) end @@ -98,7 +98,7 @@ module Compass def save! FileUtils.mkdir_p(File.dirname(filename)) saved = engine.save(filename) - options[:compass][:logger].record(:create, relativize(filename)) unless options[:quiet] + log :create, filename Compass.configuration.run_sprite_saved(filename) saved end @@ -126,6 +126,11 @@ module Compass [width, height] end + def log(action, filename, *extra) + if options[:compass] && options[:compass][:logger] && !options[:quiet] + options[:compass][:logger].record(action, relativize(filename), *extra) + end + end end end end From d794394ceb92e7acda366cd92c50f3976fb91647 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 26 Sep 2011 09:31:12 -0700 Subject: [PATCH 128/290] Add missing test fixture. --- test/fixtures/stylesheets/envtest/config.rb | 9 +++++++++ test/fixtures/stylesheets/envtest/css/env.css | 2 ++ test/fixtures/stylesheets/envtest/sass/env.scss | 3 +++ 3 files changed, 14 insertions(+) create mode 100644 test/fixtures/stylesheets/envtest/config.rb create mode 100644 test/fixtures/stylesheets/envtest/css/env.css create mode 100644 test/fixtures/stylesheets/envtest/sass/env.scss diff --git a/test/fixtures/stylesheets/envtest/config.rb b/test/fixtures/stylesheets/envtest/config.rb new file mode 100644 index 00000000..6fff7da1 --- /dev/null +++ b/test/fixtures/stylesheets/envtest/config.rb @@ -0,0 +1,9 @@ +# Require any additional compass plugins here. +project_type = :stand_alone +css_dir = "tmp" +sass_dir = "sass" +images_dir = "images" +output_style = :nested +line_comments = false + +disable_warnings = true diff --git a/test/fixtures/stylesheets/envtest/css/env.css b/test/fixtures/stylesheets/envtest/css/env.css new file mode 100644 index 00000000..1c08a273 --- /dev/null +++ b/test/fixtures/stylesheets/envtest/css/env.css @@ -0,0 +1,2 @@ +.env { + env: <%= options[:environment] %>; } diff --git a/test/fixtures/stylesheets/envtest/sass/env.scss b/test/fixtures/stylesheets/envtest/sass/env.scss new file mode 100644 index 00000000..e88f6fbe --- /dev/null +++ b/test/fixtures/stylesheets/envtest/sass/env.scss @@ -0,0 +1,3 @@ +.env { + env: compass-env(); +} From 067fb963df8fb68692ce45ab2140ca394a2b40cd Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 26 Sep 2011 13:42:12 -0400 Subject: [PATCH 129/290] updated rake and cucumber so tests pass in 1.9.3 --- Gemfile | 4 ++-- Gemfile.lock | 41 +++++++++++++++++++++-------------------- Rakefile | 1 + 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Gemfile b/Gemfile index f4971264..38a007b4 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source :rubygems gemspec -gem "cucumber", "~> 0.9.2" +gem "cucumber", "~> 1.1.0" gem "rspec", "~>2.0.0" gem "rails", "~>3.0.0.rc" gem "compass-validator", "3.0.1" @@ -18,6 +18,6 @@ gem 'mocha' gem 'timecop' gem 'diff-lcs', '~> 1.1.2' -gem 'rake', '0.8.7' +gem 'rake', '~> 0.9.2' #Warning becarful adding OS dependant gems to this file it will cause issues on the CI server \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index c4b8f64f..642290be 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.91a748a) + compass (0.12.alpha.0.d794394) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -39,16 +39,16 @@ GEM addressable (2.2.6) arel (2.0.10) builder (2.1.2) - chunky_png (1.2.1) + chunky_png (1.2.5) compass-validator (3.0.1) css_parser (1.0.1) - cucumber (0.9.4) - builder (~> 2.1.2) - diff-lcs (~> 1.1.2) - gherkin (~> 2.2.9) - json (~> 1.4.6) - term-ansicolor (~> 1.0.5) - diff-lcs (1.1.2) + cucumber (1.1.0) + builder (>= 2.1.2) + diff-lcs (>= 1.1.2) + gherkin (~> 2.5.0) + json (>= 1.4.6) + term-ansicolor (>= 1.0.6) + diff-lcs (1.1.3) em-dir-watcher (0.9.4) em-websocket (0.3.1) addressable (>= 2.1.1) @@ -57,12 +57,11 @@ GEM abstract (>= 1.0.0) eventmachine (0.12.10) fssm (0.2.7) - gherkin (2.2.9) - json (~> 1.4.6) - term-ansicolor (~> 1.0.5) - haml (3.1.2) + gherkin (2.5.1) + json (>= 1.4.6) + haml (3.1.3) i18n (0.5.0) - json (1.4.6) + json (1.6.1) livereload (1.6) em-dir-watcher (>= 0.1) em-websocket (>= 0.1.2) @@ -72,10 +71,12 @@ GEM i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) + metaclass (0.0.1) mime-types (1.16) - mocha (0.9.12) + mocha (0.10.0) + metaclass (~> 0.0.1) polyglot (0.3.2) - rack (1.2.3) + rack (1.2.4) rack-mount (0.6.14) rack (>= 1.0.0) rack-test (0.5.7) @@ -94,9 +95,9 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (~> 0.14.4) - rake (0.8.7) + rake (0.9.2) rcov (0.9.10) - rdoc (3.9.2) + rdoc (3.9.4) rspec (2.0.1) rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) @@ -126,13 +127,13 @@ DEPENDENCIES compass! compass-validator (= 3.0.1) css_parser (~> 1.0.1) - cucumber (~> 0.9.2) + cucumber (~> 1.1.0) diff-lcs (~> 1.1.2) haml (~> 3.1) livereload mocha rails (~> 3.0.0.rc) - rake (= 0.8.7) + rake (~> 0.9.2) rcov rspec (~> 2.0.0) ruby-prof diff --git a/Rakefile b/Rakefile index 40e25323..7fcfe035 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,7 @@ require 'rubygems' require 'bundler' Bundler.setup +require 'rake/dsl_definition' rescue nil require 'compass' # ----- Default: Testing ------ From 656f12a4abb4e8cfa13e19248ac81a9dcf7ede15 Mon Sep 17 00:00:00 2001 From: Colin Dean Date: Fri, 30 Sep 2011 14:01:07 -0300 Subject: [PATCH 130/290] Fixed type conversion error I encountered this when using jruby and passing an illegal option. --- bin/compass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/compass b/bin/compass index c174ce02..13c47e68 100755 --- a/bin/compass +++ b/bin/compass @@ -36,5 +36,5 @@ if ARGV.delete("--profile") printer.print(STDERR, 0) exit exit_code else - exit runner.call + exit runner.call || 0 end From 4c9656f35a056fcf9599bbdc692453db8c569789 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 4 Oct 2011 13:26:06 -0700 Subject: [PATCH 131/290] Removed UTF-8 Character from the comments. --- .../stylesheets/compass/css3/_font-face.scss | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_font-face.scss b/frameworks/compass/stylesheets/compass/css3/_font-face.scss index abb0bc53..bbca5fb4 100644 --- a/frameworks/compass/stylesheets/compass/css3/_font-face.scss +++ b/frameworks/compass/stylesheets/compass/css3/_font-face.scss @@ -46,18 +46,3 @@ } } } - -// EXAMPLE -// +font-face("this name", font-files("this.woff", "woff", "this.otf", "opentype"), "this.eot", bold, italic) -// -// will generate: -// -// @font-face { -// font-family: 'this name'; -// src: url('fonts/this.eot'); -// src: local("☺"), -// url('fonts/this.otf') format('woff'), -// url('fonts/this.woff') format('opentype'); -// font-weight: bold; -// font-style: italic; -// } From 7e32d91ae61b2ac849e8554f817d6dadc4bf5b45 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 5 Oct 2011 02:01:27 -0400 Subject: [PATCH 132/290] updated spriting docs via #403 closes #403 --- doc-src/content/help/tutorials/spriting.markdown | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 58c43b1a..3a5502c0 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -25,7 +25,7 @@ For this tutorial, let's imagine that in your project's image folder there are f * `images/icon/delete.png` Each is an icon that is 32px square. - + ## Basic Usage ****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. @@ -58,6 +58,16 @@ by setting configuration variables before you import it. See the section below o simple naming convention for your sprites so that you they are easy to remember and use. You should never have to care what the is name of the generated sprite map, nor where a sprite is located within it. + + +## Nested Folders + +Sprites stored in nested folder will use the last folder name in the path as the sprite name + +Example: + + @import "themes/orange/*.png"; + @include all-orange-sprite; ## Selector Control From bd204a4f58df50db3f050f38138bfda8725896ab Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 5 Oct 2011 02:14:29 -0400 Subject: [PATCH 133/290] typo --- doc-src/Gemfile.lock | 21 ++++++++++++------- .../content/help/tutorials/spriting.markdown | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/doc-src/Gemfile.lock b/doc-src/Gemfile.lock index bb835f00..e914e3ec 100644 --- a/doc-src/Gemfile.lock +++ b/doc-src/Gemfile.lock @@ -1,11 +1,19 @@ PATH remote: .. specs: - compass (0.12.alpha.0.374aed6) + compass (0.12.alpha.0.4fba960) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) +PATH + remote: ../../compass-theme + specs: + compass-theme (0.0.1) + compass (~> 0.11) + compass-susy-plugin (>= 0.7.0.pre8) + css-slideshow (= 0.2.0) + GEM remote: http://rubygems.org/ specs: @@ -13,14 +21,10 @@ GEM adsf (1.0.1) rack (>= 1.0.0) builder (3.0.0) - chunky_png (1.2.1) + chunky_png (1.2.5) coderay (0.9.8) compass-susy-plugin (0.9) compass (>= 0.11.1) - compass-theme (0.0.1) - compass (~> 0.11) - compass-susy-plugin (>= 0.7.0.pre8) - css-slideshow (= 0.2.0) cri (2.0.2) css-slideshow (0.2.0) compass (>= 0.10.0.rc3) @@ -38,7 +42,7 @@ GEM rb-fsevent (0.4.3.1) rdiscount (1.6.8) ruby-prof (0.10.8) - sass (3.1.7) + sass (3.1.8) serve (1.0.0) activesupport (~> 3.0.1) i18n (~> 0.4.1) @@ -51,11 +55,12 @@ PLATFORMS ruby DEPENDENCIES + activesupport (~> 3.0.10) adsf builder coderay compass! - compass-theme (~> 0.0.1) + compass-theme! css_parser (= 1.0.1) haml json diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 3a5502c0..53966616 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -62,7 +62,7 @@ is located within it. ## Nested Folders -Sprites stored in nested folder will use the last folder name in the path as the sprite name +Sprites stored in a nested folder will use the last folder name in the path as the sprite name. Example: From 7c738cd3797f9ecfc7dba5d214a6155331b2d685 Mon Sep 17 00:00:00 2001 From: David Chambers Date: Thu, 6 Oct 2011 21:41:41 -0700 Subject: [PATCH 134/290] css3: use `transition` shorthand if appropriate (closes #585) --- .../stylesheets/compass/css3/_transition.scss | 37 ++++++++++++++++--- .../stylesheets/compass/css/transition.css | 12 ++++++ .../stylesheets/compass/sass/transition.scss | 4 ++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/stylesheets/compass/css/transition.css create mode 100644 test/fixtures/stylesheets/compass/sass/transition.scss diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index 2cab9fd5..ae98aae2 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -73,15 +73,42 @@ $default-transition-delay: false !default; // Transition all-in-one shorthand @mixin single-transition( - $properties: $default-transition-property, + $property: $default-transition-property, $duration: $default-transition-duration, $function: $default-transition-function, $delay: $default-transition-delay ) { - @include transition-property($properties); - @include transition-duration($duration); - @if $function { @include transition-timing-function($function); } - @if $delay { @include transition-delay($delay); } + @if $property and $duration and $function { + // Shorthand (see https://github.com/chriseppstein/compass/issues/585) + @if $delay { + -webkit-transition: $property $duration $function; + -webkit-transition-delay: $delay; + @include experimental(transition, $property $duration $function $delay, + -moz, + not -webkit, + -o, + not -ms, + not -khtml, + official + ); + } + @else { + @include experimental(transition, $property $duration $function, + -moz, + -webkit, + -o, + not -ms, + not -khtml, + official + ); + } + } + @else { + @include transition-property($property); + @include transition-duration($duration); + @if $function { @include transition-timing-function($function); } + @if $delay { @include transition-delay($delay); } + } } @mixin transition( diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css new file mode 100644 index 00000000..5d38c42f --- /dev/null +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -0,0 +1,12 @@ +.single-transition-without-delay { + -moz-transition: all 0.6s ease-out; + -webkit-transition: all 0.6s ease-out; + -o-transition: all 0.6s ease-out; + transition: all 0.6s ease-out; } + +.single-transition-with-delay { + -webkit-transition: all 0.6s ease-out; + -webkit-transition-delay: 0.2s; + -moz-transition: all 0.6s ease-out 0.2s; + -o-transition: all 0.6s ease-out 0.2s; + transition: all 0.6s ease-out 0.2s; } diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss new file mode 100644 index 00000000..8cee1166 --- /dev/null +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -0,0 +1,4 @@ +@import "compass/css3/transition"; + +.single-transition-without-delay { @include single-transition(all, 0.6s, ease-out); } +.single-transition-with-delay { @include single-transition(all, 0.6s, ease-out, 0.2s); } From 8ede06f001616350faa099e63178d884235896fa Mon Sep 17 00:00:00 2001 From: Paul Irish Date: Thu, 6 Oct 2011 13:15:00 -0700 Subject: [PATCH 135/290] more attractive whitespace for prefixed and aligned styles --- .../stylesheets/compass/css3/_shared.scss | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_shared.scss b/frameworks/compass/stylesheets/compass/css3/_shared.scss index e1a7628a..57223d6d 100644 --- a/frameworks/compass/stylesheets/compass/css3/_shared.scss +++ b/frameworks/compass/stylesheets/compass/css3/_shared.scss @@ -5,34 +5,34 @@ // the implementations are identical except for the property // prefix. @mixin experimental($property, $value, - $moz : $experimental-support-for-mozilla, $webkit : $experimental-support-for-webkit, - $o : $experimental-support-for-opera, - $ms : $experimental-support-for-microsoft, $khtml : $experimental-support-for-khtml, + $moz : $experimental-support-for-mozilla, + $ms : $experimental-support-for-microsoft, + $o : $experimental-support-for-opera, $official : true ) { - @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; } @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; } - @if $o and $experimental-support-for-opera { -o-#{$property} : $value; } - @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; } @if $khtml and $experimental-support-for-khtml { -khtml-#{$property} : $value; } + @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; } + @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; } + @if $o and $experimental-support-for-opera { -o-#{$property} : $value; } @if $official { #{$property} : $value; } } // Same as experimental(), but for cases when the property is the same and the value is vendorized @mixin experimental-value($property, $value, - $moz : $experimental-support-for-mozilla, $webkit : $experimental-support-for-webkit, - $o : $experimental-support-for-opera, - $ms : $experimental-support-for-microsoft, $khtml : $experimental-support-for-khtml, + $moz : $experimental-support-for-mozilla, + $ms : $experimental-support-for-microsoft, + $o : $experimental-support-for-opera, $official : true ) { - @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; } @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; } - @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; } - @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; } @if $khtml and $experimental-support-for-khtml { #{$property} : -khtml-#{$value}; } + @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; } + @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; } + @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; } @if $official { #{$property} : #{$value}; } } From efdb00cc1439cf47ac807990e8e1397b52359964 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:00:26 -0400 Subject: [PATCH 136/290] updated tests that the previous commit from @paulirish broke --- Gemfile.lock | 2 +- .../stylesheets/blueprint/css/screen.css | 4 +- .../blueprint/css/single-imports/debug.css | 4 +- .../stylesheets/compass/css/border_radius.css | 18 +- test/fixtures/stylesheets/compass/css/box.css | 38 ++-- .../stylesheets/compass/css/box_shadow.css | 12 +- .../stylesheets/compass/css/columns.css | 32 +-- .../compass/css/grid_background.css | 16 +- test/fixtures/stylesheets/compass/css/pie.css | 6 +- .../stylesheets/compass/css/transform.css | 184 +++++++++--------- .../compass/css/user-interface.css | 4 +- 11 files changed, 160 insertions(+), 160 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 642290be..88cf3789 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.d794394) + compass (0.12.alpha.0.8ede06f) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/test/fixtures/stylesheets/blueprint/css/screen.css b/test/fixtures/stylesheets/blueprint/css/screen.css index abbea935..d5c2ece7 100644 --- a/test/fixtures/stylesheets/blueprint/css/screen.css +++ b/test/fixtures/stylesheets/blueprint/css/screen.css @@ -671,9 +671,9 @@ input.span-24, textarea.span-24, select.span-24 { background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -o-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); - -moz-background-size: 100% 18px, auto; -webkit-background-size: 100% 18px, auto; - -o-background-size: 100% 18px, auto; + -khtml-background-size: 100% 18px, auto; + -moz-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css index 738b46d3..e1966afb 100644 --- a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +++ b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css @@ -5,8 +5,8 @@ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -o-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); - -moz-background-size: 100% 18px, auto; -webkit-background-size: 100% 18px, auto; - -o-background-size: 100% 18px, auto; + -khtml-background-size: 100% 18px, auto; + -moz-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/border_radius.css b/test/fixtures/stylesheets/compass/css/border_radius.css index 5eef9e03..878c5f87 100644 --- a/test/fixtures/stylesheets/compass/css/border_radius.css +++ b/test/fixtures/stylesheets/compass/css/border_radius.css @@ -1,23 +1,23 @@ .simple { - -webkit-border-radius: 4px 4px; + -khtml-border-radius: 4px 4px; + -webkit-border-radius: 4px / 4px; -moz-border-radius: 4px / 4px; - -o-border-radius: 4px / 4px; -ms-border-radius: 4px / 4px; - -khtml-border-radius: 4px / 4px; + -o-border-radius: 4px / 4px; border-radius: 4px / 4px; } .compound { - -webkit-border-radius: 2px 3px; + -khtml-border-radius: 2px 3px; + -webkit-border-radius: 2px 5px / 3px 6px; -moz-border-radius: 2px 5px / 3px 6px; - -o-border-radius: 2px 5px / 3px 6px; -ms-border-radius: 2px 5px / 3px 6px; - -khtml-border-radius: 2px 5px / 3px 6px; + -o-border-radius: 2px 5px / 3px 6px; border-radius: 2px 5px / 3px 6px; } .crazy { - -webkit-border-radius: 1px 2px; + -khtml-border-radius: 1px 2px; + -webkit-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -moz-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; - -o-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -ms-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; - -khtml-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; + -o-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; } diff --git a/test/fixtures/stylesheets/compass/css/box.css b/test/fixtures/stylesheets/compass/css/box.css index 9c1cdc9d..3d2841d8 100644 --- a/test/fixtures/stylesheets/compass/css/box.css +++ b/test/fixtures/stylesheets/compass/css/box.css @@ -1,103 +1,103 @@ .hbox { - display: -moz-box; display: -webkit-box; + display: -khtml-box; display: -ms-box; display: box; - -moz-box-orient: horizontal; -webkit-box-orient: horizontal; + -khtml-box-orient: horizontal; -ms-box-orient: horizontal; box-orient: horizontal; - -moz-box-align: stretch; -webkit-box-align: stretch; + -khtml-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .hbox > * { - -moz-box-flex: 0; -webkit-box-flex: 0; + -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .vbox { - display: -moz-box; display: -webkit-box; + display: -khtml-box; display: -ms-box; display: box; - -moz-box-orient: vertical; -webkit-box-orient: vertical; + -khtml-box-orient: vertical; -ms-box-orient: vertical; box-orient: vertical; - -moz-box-align: stretch; -webkit-box-align: stretch; + -khtml-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .vbox > * { - -moz-box-flex: 0; -webkit-box-flex: 0; + -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .spacer { - -moz-box-flex: 1; -webkit-box-flex: 1; + -khtml-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .reverse { - -moz-box-direction: reverse; -webkit-box-direction: reverse; + -khtml-box-direction: reverse; -ms-box-direction: reverse; box-direction: reverse; } .box-flex-0 { - -moz-box-flex: 0; -webkit-box-flex: 0; + -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .box-flex-1 { - -moz-box-flex: 1; -webkit-box-flex: 1; + -khtml-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .box-flex-2 { - -moz-box-flex: 2; -webkit-box-flex: 2; + -khtml-box-flex: 2; -ms-box-flex: 2; box-flex: 2; } .box-flex-group-0 { - -moz-box-flex-group: 0; -webkit-box-flex-group: 0; + -khtml-box-flex-group: 0; -ms-box-flex-group: 0; box-flex-group: 0; } .box-flex-group-1 { - -moz-box-flex-group: 1; -webkit-box-flex-group: 1; + -khtml-box-flex-group: 1; -ms-box-flex-group: 1; box-flex-group: 1; } .box-flex-group-2 { - -moz-box-flex-group: 2; -webkit-box-flex-group: 2; + -khtml-box-flex-group: 2; -ms-box-flex-group: 2; box-flex-group: 2; } .start { - -moz-box-pack: start; -webkit-box-pack: start; + -khtml-box-pack: start; -ms-box-pack: start; box-pack: start; } .end { - -moz-box-pack: end; -webkit-box-pack: end; + -khtml-box-pack: end; -ms-box-pack: end; box-pack: end; } .center { - -moz-box-pack: center; -webkit-box-pack: center; + -khtml-box-pack: center; -ms-box-pack: center; box-pack: center; } diff --git a/test/fixtures/stylesheets/compass/css/box_shadow.css b/test/fixtures/stylesheets/compass/css/box_shadow.css index 92aa4f8b..c0e9ebb6 100644 --- a/test/fixtures/stylesheets/compass/css/box_shadow.css +++ b/test/fixtures/stylesheets/compass/css/box_shadow.css @@ -1,17 +1,17 @@ .box-shadow { - -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -khtml-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } .single-box-shadow { - -moz-box-shadow: 0px 0px 5px #333333; -webkit-box-shadow: 0px 0px 5px #333333; - -o-box-shadow: 0px 0px 5px #333333; + -khtml-box-shadow: 0px 0px 5px #333333; + -moz-box-shadow: 0px 0px 5px #333333; box-shadow: 0px 0px 5px #333333; } .multiple-box-shadows { - -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -khtml-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } diff --git a/test/fixtures/stylesheets/compass/css/columns.css b/test/fixtures/stylesheets/compass/css/columns.css index c49d7ba6..1aa56ca4 100644 --- a/test/fixtures/stylesheets/compass/css/columns.css +++ b/test/fixtures/stylesheets/compass/css/columns.css @@ -1,47 +1,47 @@ .column-count { - -moz-column-count: 5; -webkit-column-count: 5; - -o-column-count: 5; + -khtml-column-count: 5; + -moz-column-count: 5; column-count: 5; } .column-gap { - -moz-column-gap: 10px; -webkit-column-gap: 10px; - -o-column-gap: 10px; + -khtml-column-gap: 10px; + -moz-column-gap: 10px; column-gap: 10px; } .column-width { - -moz-column-width: 90px; -webkit-column-width: 90px; - -o-column-width: 90px; + -khtml-column-width: 90px; + -moz-column-width: 90px; column-width: 90px; } .column-rule-width { - -moz-rule-width: 1px; -webkit-rule-width: 1px; - -o-rule-width: 1px; + -khtml-rule-width: 1px; + -moz-rule-width: 1px; rule-width: 1px; } .column-rule-style { - -moz-rule-style: dotted; -webkit-rule-style: dotted; - -o-rule-style: dotted; + -khtml-rule-style: dotted; + -moz-rule-style: dotted; rule-style: dotted; } .column-rule-color { - -moz-rule-color: blue; -webkit-rule-color: blue; - -o-rule-color: blue; + -khtml-rule-color: blue; + -moz-rule-color: blue; rule-color: blue; } .column-rule { - -moz-column-rule: 1px solid blue; -webkit-column-rule: 1px solid blue; - -o-column-rule: 1px solid blue; + -khtml-column-rule: 1px solid blue; + -moz-column-rule: 1px solid blue; column-rule: 1px solid blue; } .column-rule-spaced { - -moz-column-rule: 1px solid blue; -webkit-column-rule: 1px solid blue; - -o-column-rule: 1px solid blue; + -khtml-column-rule: 1px solid blue; + -moz-column-rule: 1px solid blue; column-rule: 1px solid blue; } diff --git a/test/fixtures/stylesheets/compass/css/grid_background.css b/test/fixtures/stylesheets/compass/css/grid_background.css index 44b5f13e..b269febf 100644 --- a/test/fixtures/stylesheets/compass/css/grid_background.css +++ b/test/fixtures/stylesheets/compass/css/grid_background.css @@ -5,9 +5,9 @@ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); - -moz-background-size: 100% 1.5em; -webkit-background-size: 100% 1.5em; - -o-background-size: 100% 1.5em; + -khtml-background-size: 100% 1.5em; + -moz-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -27,9 +27,9 @@ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -o-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); - -moz-background-size: 100% 1.5em, auto; -webkit-background-size: 100% 1.5em, auto; - -o-background-size: 100% 1.5em, auto; + -khtml-background-size: 100% 1.5em, auto; + -moz-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } @@ -40,9 +40,9 @@ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); - -moz-background-size: 100% 1.5em; -webkit-background-size: 100% 1.5em; - -o-background-size: 100% 1.5em; + -khtml-background-size: 100% 1.5em; + -moz-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -62,9 +62,9 @@ background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -o-linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); - -moz-background-size: 100% 1.5em, auto; -webkit-background-size: 100% 1.5em, auto; - -o-background-size: 100% 1.5em, auto; + -khtml-background-size: 100% 1.5em, auto; + -moz-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/pie.css b/test/fixtures/stylesheets/compass/css/pie.css index 7f774b14..5a4337f2 100644 --- a/test/fixtures/stylesheets/compass/css/pie.css +++ b/test/fixtures/stylesheets/compass/css/pie.css @@ -3,11 +3,11 @@ position: relative; } .bordered { - -moz-border-radius: 5px; -webkit-border-radius: 5px; - -o-border-radius: 5px; - -ms-border-radius: 5px; -khtml-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; border-radius: 5px; } .gradient { diff --git a/test/fixtures/stylesheets/compass/css/transform.css b/test/fixtures/stylesheets/compass/css/transform.css index a1745a52..c7cdaa61 100644 --- a/test/fixtures/stylesheets/compass/css/transform.css +++ b/test/fixtures/stylesheets/compass/css/transform.css @@ -1,333 +1,333 @@ .apply-origin-2d { - -moz-transform-origin: 2px 5%; -webkit-transform-origin: 2px 5%; - -o-transform-origin: 2px 5%; + -khtml-transform-origin: 2px 5%; + -moz-transform-origin: 2px 5%; -ms-transform-origin: 2px 5%; transform-origin: 2px 5%; } .apply-origin-3d { - -webkit-transform-origin: 2px 5% 2in; + -khtml-transform-origin: 2px 5% 2in; transform-origin: 2px 5% 2in; } .transform-origin-2d { - -moz-transform-origin: 100px 100px; -webkit-transform-origin: 100px 100px; - -o-transform-origin: 100px 100px; + -khtml-transform-origin: 100px 100px; + -moz-transform-origin: 100px 100px; -ms-transform-origin: 100px 100px; transform-origin: 100px 100px; } .transform-origin-3d { - -webkit-transform-origin: 100px 100px 100px; + -khtml-transform-origin: 100px 100px 100px; transform-origin: 100px 100px 100px; } .transform-2d { - -moz-transform: rotateY(20deg); -webkit-transform: rotateY(20deg); - -o-transform: rotateY(20deg); + -khtml-transform: rotateY(20deg); + -moz-transform: rotateY(20deg); -ms-transform: rotateY(20deg); transform: rotateY(20deg); } .transform-3d { - -webkit-transform: rotateZ(20deg); + -khtml-transform: rotateZ(20deg); transform: rotateZ(20deg); } .perspective { - -webkit-perspective: 500; + -khtml-perspective: 500; perspective: 500; } .perspective-origin { - -webkit-perspective-origin: 25% 25%; + -khtml-perspective-origin: 25% 25%; perspective-origin: 25% 25%; } .transform-style { - -webkit-transform-style: preserve-3d; + -khtml-transform-style: preserve-3d; transform-style: preserve-3d; } .backface-visibility { - -webkit-backface-visibility: hidden; + -khtml-backface-visibility: hidden; backface-visibility: hidden; } .scale { - -moz-transform: scale(30px, 50px); -webkit-transform: scale(30px, 50px); - -o-transform: scale(30px, 50px); + -khtml-transform: scale(30px, 50px); + -moz-transform: scale(30px, 50px); -ms-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-3d { - -webkit-transform: scale(30px, 50px); + -khtml-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-with-perspective { - -moz-transform: perspective(500) scale(30px, 50px); -webkit-transform: perspective(500) scale(30px, 50px); - -o-transform: perspective(500) scale(30px, 50px); + -khtml-transform: perspective(500) scale(30px, 50px); + -moz-transform: perspective(500) scale(30px, 50px); -ms-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-3d-with-perspective { - -webkit-transform: perspective(500) scale(30px, 50px); + -khtml-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-x { - -moz-transform: scaleX(30px); -webkit-transform: scaleX(30px); - -o-transform: scaleX(30px); + -khtml-transform: scaleX(30px); + -moz-transform: scaleX(30px); -ms-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-3d { - -webkit-transform: scaleX(30px); + -khtml-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-with-perspective { - -moz-transform: perspective(500) scaleX(30px); -webkit-transform: perspective(500) scaleX(30px); - -o-transform: perspective(500) scaleX(30px); + -khtml-transform: perspective(500) scaleX(30px); + -moz-transform: perspective(500) scaleX(30px); -ms-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-x-3d-with-perspective { - -webkit-transform: perspective(500) scaleX(30px); + -khtml-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-y { - -moz-transform: scaleY(50px); -webkit-transform: scaleY(50px); - -o-transform: scaleY(50px); + -khtml-transform: scaleY(50px); + -moz-transform: scaleY(50px); -ms-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-3d { - -webkit-transform: scaleY(50px); + -khtml-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-with-perspective { - -moz-transform: perspective(500) scaleY(50px); -webkit-transform: perspective(500) scaleY(50px); - -o-transform: perspective(500) scaleY(50px); + -khtml-transform: perspective(500) scaleY(50px); + -moz-transform: perspective(500) scaleY(50px); -ms-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-y-3d-with-perspective { - -webkit-transform: perspective(500) scaleY(50px); + -khtml-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-z { - -webkit-transform: scaleZ(50px); + -khtml-transform: scaleZ(50px); transform: scaleZ(50px); } .scale-z-with-perspective { - -webkit-transform: perspective(500) scaleZ(50px); + -khtml-transform: perspective(500) scaleZ(50px); transform: perspective(500) scaleZ(50px); } .scale3d { - -webkit-transform: scale3d(30px, 50px, 100px); + -khtml-transform: scale3d(30px, 50px, 100px); transform: scale3d(30px, 50px, 100px); } .scaled3-with-perspective { - -webkit-transform: perspective(500) scale3d(30px, 50px, 100px); + -khtml-transform: perspective(500) scale3d(30px, 50px, 100px); transform: perspective(500) scale3d(30px, 50px, 100px); } .rotate { - -moz-transform: perspective(500) rotate(25deg); -webkit-transform: perspective(500) rotate(25deg); - -o-transform: perspective(500) rotate(25deg); + -khtml-transform: perspective(500) rotate(25deg); + -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-with-perspective { - -moz-transform: perspective(500) rotate(25deg); -webkit-transform: perspective(500) rotate(25deg); - -o-transform: perspective(500) rotate(25deg); + -khtml-transform: perspective(500) rotate(25deg); + -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-z { - -moz-transform: rotate(25deg); -webkit-transform: rotate(25deg); - -o-transform: rotate(25deg); + -khtml-transform: rotate(25deg); + -moz-transform: rotate(25deg); -ms-transform: rotate(25deg); transform: rotate(25deg); } .rotate-z-with-perspective { - -moz-transform: perspective(500) rotate(25deg); -webkit-transform: perspective(500) rotate(25deg); - -o-transform: perspective(500) rotate(25deg); + -khtml-transform: perspective(500) rotate(25deg); + -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-x { - -webkit-transform: rotateX(25deg); + -khtml-transform: rotateX(25deg); transform: rotateX(25deg); } .rotate-x-with-perspective { - -webkit-transform: perspective(500) rotateX(25deg); + -khtml-transform: perspective(500) rotateX(25deg); transform: perspective(500) rotateX(25deg); } .rotate-y { - -webkit-transform: rotateY(25deg); + -khtml-transform: rotateY(25deg); transform: rotateY(25deg); } .rotate-y-with-perspective { - -webkit-transform: perspective(500) rotateY(25deg); + -khtml-transform: perspective(500) rotateY(25deg); transform: perspective(500) rotateY(25deg); } .rotate-3d { - -webkit-transform: rotate3d(5, 2, 1, 75deg); + -khtml-transform: rotate3d(5, 2, 1, 75deg); transform: rotate3d(5, 2, 1, 75deg); } .rotate-3d-with-perspective { - -webkit-transform: perspective(500) rotate3d(5, 2, 1, 75deg); + -khtml-transform: perspective(500) rotate3d(5, 2, 1, 75deg); transform: perspective(500) rotate3d(5, 2, 1, 75deg); } .translate { - -moz-transform: translate(20px, 30%); -webkit-transform: translate(20px, 30%); - -o-transform: translate(20px, 30%); + -khtml-transform: translate(20px, 30%); + -moz-transform: translate(20px, 30%); -ms-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-with-perspective { - -moz-transform: perspective(500) translate(20px, 30%); -webkit-transform: perspective(500) translate(20px, 30%); - -o-transform: perspective(500) translate(20px, 30%); + -khtml-transform: perspective(500) translate(20px, 30%); + -moz-transform: perspective(500) translate(20px, 30%); -ms-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-3d { - -webkit-transform: translate(20px, 30%); + -khtml-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-3d-with-perspective { - -webkit-transform: perspective(500) translate(20px, 30%); + -khtml-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-x { - -moz-transform: translateX(30px); -webkit-transform: translateX(30px); - -o-transform: translateX(30px); + -khtml-transform: translateX(30px); + -moz-transform: translateX(30px); -ms-transform: translateX(30px); transform: translateX(30px); } .translate-x-3d { - -webkit-transform: translateX(30px); + -khtml-transform: translateX(30px); transform: translateX(30px); } .translate-x-with-perspective { - -moz-transform: perspective(500) translateX(30px); -webkit-transform: perspective(500) translateX(30px); - -o-transform: perspective(500) translateX(30px); + -khtml-transform: perspective(500) translateX(30px); + -moz-transform: perspective(500) translateX(30px); -ms-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-x-3d-with-perspective { - -webkit-transform: perspective(500) translateX(30px); + -khtml-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-y { - -moz-transform: translateY(30px); -webkit-transform: translateY(30px); - -o-transform: translateY(30px); + -khtml-transform: translateY(30px); + -moz-transform: translateY(30px); -ms-transform: translateY(30px); transform: translateY(30px); } .translate-y-3d { - -webkit-transform: translateY(30px); + -khtml-transform: translateY(30px); transform: translateY(30px); } .translate-y-with-perspective { - -moz-transform: perspective(500) translateY(30px); -webkit-transform: perspective(500) translateY(30px); - -o-transform: perspective(500) translateY(30px); + -khtml-transform: perspective(500) translateY(30px); + -moz-transform: perspective(500) translateY(30px); -ms-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-y-3d-with-perspective { - -webkit-transform: perspective(500) translateY(30px); + -khtml-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-z { - -webkit-transform: translateZ(30px); + -khtml-transform: translateZ(30px); transform: translateZ(30px); } .translate-z-with-perspective { - -webkit-transform: perspective(500) translateZ(30px); + -khtml-transform: perspective(500) translateZ(30px); transform: perspective(500) translateZ(30px); } .translate-3d { - -webkit-transform: translate3d(30px, 50px, 75px); + -khtml-transform: translate3d(30px, 50px, 75px); transform: translate3d(30px, 50px, 75px); } .translate-3d-with-perspective { - -webkit-transform: perspective(500) translate3d(30px, 50px, 75px); + -khtml-transform: perspective(500) translate3d(30px, 50px, 75px); transform: perspective(500) translate3d(30px, 50px, 75px); } .skew { - -moz-transform: skew(20deg, 50deg); -webkit-transform: skew(20deg, 50deg); - -o-transform: skew(20deg, 50deg); + -khtml-transform: skew(20deg, 50deg); + -moz-transform: skew(20deg, 50deg); -ms-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-3d { - -webkit-transform: skew(20deg, 50deg); + -khtml-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-x { - -moz-transform: skewX(20deg); -webkit-transform: skewX(20deg); - -o-transform: skewX(20deg); + -khtml-transform: skewX(20deg); + -moz-transform: skewX(20deg); -ms-transform: skewX(20deg); transform: skewX(20deg); } .skew-x-3d { - -webkit-transform: skewX(20deg); + -khtml-transform: skewX(20deg); transform: skewX(20deg); } .skew-y { - -moz-transform: skewY(20deg); -webkit-transform: skewY(20deg); - -o-transform: skewY(20deg); + -khtml-transform: skewY(20deg); + -moz-transform: skewY(20deg); -ms-transform: skewY(20deg); transform: skewY(20deg); } .skew-y-3d { - -webkit-transform: skewY(20deg); + -khtml-transform: skewY(20deg); transform: skewY(20deg); } .create-transform-2d { - -moz-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -webkit-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); - -o-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); + -khtml-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); + -moz-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); - -moz-transform-origin: 50%; -webkit-transform-origin: 50%; - -o-transform-origin: 50%; + -khtml-transform-origin: 50%; + -moz-transform-origin: 50%; -ms-transform-origin: 50%; transform-origin: 50%; } .create-transform-3d { - -moz-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -webkit-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); - -o-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); + -khtml-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); + -moz-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); - -moz-transform-origin: 50% 50%; -webkit-transform-origin: 50% 50%; - -o-transform-origin: 50% 50%; + -khtml-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; } .simple-transform { - -moz-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -webkit-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); - -o-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); + -khtml-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); + -moz-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -ms-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); - -moz-transform-origin: 10% 10%; -webkit-transform-origin: 10% 10%; - -o-transform-origin: 10% 10%; + -khtml-transform-origin: 10% 10%; + -moz-transform-origin: 10% 10%; -ms-transform-origin: 10% 10%; transform-origin: 10% 10%; } diff --git a/test/fixtures/stylesheets/compass/css/user-interface.css b/test/fixtures/stylesheets/compass/css/user-interface.css index 8b1a1aae..29a6acfd 100644 --- a/test/fixtures/stylesheets/compass/css/user-interface.css +++ b/test/fixtures/stylesheets/compass/css/user-interface.css @@ -1,5 +1,5 @@ .user-select { - -moz-user-select: -moz-none; - -webkit-user-select: none; + -webkit-user-select: -moz-none; -khtml-user-select: none; + -o-user-select: none; user-select: none; } From 93ff7b31ec701a79319ff5a1f995cdafefb32102 Mon Sep 17 00:00:00 2001 From: brainopia Date: Sun, 9 Oct 2011 02:11:21 +0400 Subject: [PATCH 137/290] merge --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 95e5dda8..77674089 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -100,6 +100,7 @@ module Compass saved = engine.save(filename) log :create, filename Compass.configuration.run_sprite_saved(filename) + @mtime = nil if saved saved end From dd75f7241eaf7178182cf675f2954fe4c046d0a1 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:19:27 -0400 Subject: [PATCH 138/290] micro optimization via @brainopia --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 77674089..1fc5b43d 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -112,7 +112,7 @@ module Compass # Checks whether this sprite is outdated def outdated? if File.exists?(filename) - return @images.map(&:mtime).any? { |imtime| imtime.to_i > self.mtime.to_i } + return @images.any? {|image| image.mtime.to_i > self.mtime.to_i } end true end From c6d9e3fb35b0e511c8fec6622acfd847eb9e8382 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:28:49 -0400 Subject: [PATCH 139/290] closes #588 --- .../help/tutorials/configuration-reference.markdown | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc-src/content/help/tutorials/configuration-reference.markdown b/doc-src/content/help/tutorials/configuration-reference.markdown index 66808bf7..9baa2575 100644 --- a/doc-src/content/help/tutorials/configuration-reference.markdown +++ b/doc-src/content/help/tutorials/configuration-reference.markdown @@ -309,6 +309,13 @@ later on. Defaults to {:compression => Zlib::BEST_COMPRESSION}. See the chunky_png wiki for more information + + sprite_load_path + Array + + Defaults to [images_path] + + From 7caec96642fb4f9f02c43e0cb761bf26d6fc64f9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:29:50 -0400 Subject: [PATCH 140/290] closes #478 --- doc-src/content/help/tutorials/configuration-reference.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/help/tutorials/configuration-reference.markdown b/doc-src/content/help/tutorials/configuration-reference.markdown index 9baa2575..789f1802 100644 --- a/doc-src/content/help/tutorials/configuration-reference.markdown +++ b/doc-src/content/help/tutorials/configuration-reference.markdown @@ -143,7 +143,7 @@ later on. sass_dir String The directory where the sass stylesheets are kept. - It is relative to the project_path. Defaults to "src". + It is relative to the project_path. Defaults to "sass". From 0b169fec229bd4bc0db2ef256e777c801633f2e5 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:36:35 -0400 Subject: [PATCH 141/290] closes #237 --- .../content/help/tutorials/testing.markdown | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 doc-src/content/help/tutorials/testing.markdown diff --git a/doc-src/content/help/tutorials/testing.markdown b/doc-src/content/help/tutorials/testing.markdown new file mode 100644 index 00000000..0761261f --- /dev/null +++ b/doc-src/content/help/tutorials/testing.markdown @@ -0,0 +1,24 @@ +--- +title: Testing Your Stylesheets +layout: tutorial +crumb: Testing +classnames: + - tutorial +--- + +# Test Unit + + require 'compass/test_case' + class StylesheetsTest < Compass::TestCase + def test_stylesheets + my_sass_files.each do |sass_file| + assert_compiles(sass_file) do |result| + assert_not_blank result + end + end + end + protected + def my_sass_files + Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), "../..", "app/stylesheets/**/[^_]*.sass"))) + end + end \ No newline at end of file From 3337b07ec78134613dc78595d1d0d967671e77af Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 09:44:00 -0400 Subject: [PATCH 142/290] closes #507 --- .../help/tutorials/integration.markdown | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/doc-src/content/help/tutorials/integration.markdown b/doc-src/content/help/tutorials/integration.markdown index 4b0d8fd8..715a624d 100644 --- a/doc-src/content/help/tutorials/integration.markdown +++ b/doc-src/content/help/tutorials/integration.markdown @@ -55,29 +55,31 @@ At the top of the Nanoc Rules file, load the Compass configuration, like this: require 'compass' - Compass.add_project_configuration 'compass/config.rb' # when using Compass 0.10 - Compass.configuration.parse 'compass/config.rb' # when using Compass < 0.10 + Compass.add_project_configuration 'compass.rb' # when using Compass > 0.10 + Compass.configuration.parse 'compass.rb' # when using Compass < 0.10 Your Compass configuration file (in compass/config.rb) could look like this (you may need to change the path to some directories depending on your directory structure): - http_path = "/" - project_path = "." - css_dir = "output/assets/style" - sass_dir = "content/assets/style" - images_dir = "output/assets/images" - - # when using SCSS: - sass_options = { - :syntax => :scss - } + http_path = "/" + project_path = File.expand_path(File.join(File.dirname(__FILE__), '..')) + css_dir = "output/stylesheets" + sass_dir = "content/stylesheets" + images_dir = "assets/images" + javascripts_dir = "assets/javascripts" + fonts_dir = "assets/fonts" + http_javascripts_dir = "javascripts" + http_stylesheets_dir = "stylesheets" + http_images_dir = "images" + http_fonts_dir = "fonts" To filter the stylesheets using Sass and Compass, call the sass filter with Sass engine options taken from Compass, like this: - filter :sass, Compass.sass_engine_options + compile '/stylesheets/*' do + filter :sass, sass_options.merge(:syntax => item[:extension].to_sym) + end ### Nanoc Projects using the formal approach -* [nanoc Bootstrap](http://github.com/adamstac/nanoc-bootstrap) - a base nanoc project with support for Haml, Sass, Compass, jQuery and more. -* [nanoc & Compass Example Project](http://github.com/ddfreyne/nanoc-bootstrap-compass) \ No newline at end of file +* [This Site](https://github.com/chriseppstein/compass/tree/master/doc-src) From ebb2e42acc8a49cd77a712e955cb349fe07f89ee Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 9 Oct 2011 11:34:39 -0400 Subject: [PATCH 143/290] closes #378 --- .../help/tutorials/integration.markdown | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/doc-src/content/help/tutorials/integration.markdown b/doc-src/content/help/tutorials/integration.markdown index 715a624d..e9dfc1a8 100644 --- a/doc-src/content/help/tutorials/integration.markdown +++ b/doc-src/content/help/tutorials/integration.markdown @@ -9,6 +9,13 @@ classnames: ## Ruby on Rails +### Rails 3.1 +Just add compass to your Gemfile like so: + + gem 'compass' + +Also checkout this [gist](https://gist.github.com/1184843) + ### Rails 3 compass init rails /path/to/myrailsproject ### Rails 2.3 @@ -16,26 +23,26 @@ classnames: ## Sinatra + require 'compass' require 'sinatra' require 'haml' - require 'sass' - require 'compass' configure do - Compass.configuration do |config| - config.project_path = File.dirname(__FILE__) - config.sass_dir = 'views' - end - - set :haml, { :format => :html5 } - set :sass, Compass.sass_engine_options + set :haml, {:format => :html5, :escape_html => true} + set :scss, {:style => :compact, :debug_info => false} + Compass.add_project_configuration(File.join(Sinatra::Application.root, 'config', 'compass.rb')) end - get '/screen.css' do + get '/stylesheets/:name.css' do content_type 'text/css', :charset => 'utf-8' - sass :screen + scss(:"stylesheets/#{params[:name]}" ) end + get '/' do + haml :index + end + + If you keep your stylesheets in “views/stylesheets/” directory instead of just “views/”, remember to update sass_dir configuration accordingly. Check out this [sample compass-sinatra project](http://github.com/chriseppstein/compass-sinatra) to get up and running in no time! From afdd2085947b04b5e959eae3d85834171ceba0bd Mon Sep 17 00:00:00 2001 From: Dan Gayle Date: Tue, 11 Oct 2011 16:12:16 -0700 Subject: [PATCH 144/290] Created tutorial for removing vendor specific prefixes --- .../exclude_vendor_prefixes.markdown | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 doc-src/content/help/tutorials/exclude_vendor_prefixes.markdown diff --git a/doc-src/content/help/tutorials/exclude_vendor_prefixes.markdown b/doc-src/content/help/tutorials/exclude_vendor_prefixes.markdown new file mode 100644 index 00000000..f7226348 --- /dev/null +++ b/doc-src/content/help/tutorials/exclude_vendor_prefixes.markdown @@ -0,0 +1,71 @@ +--- +title: Removing Vendor Prefixes from Compass Stylesheets +layout: tutorial +crumb: Removing Vendor Prefixes from Compass +classnames: + - tutorial +--- +# Removing Vendor Prefixes from Compass Stylesheets + +Compass makes it easy to code many of the CSS3 vendor prefixed properties, without having to type it all out by hand. + +## Easy Vendor Prefixes + +Let's say you wanted to add a border radius to an element like this: + + .round { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + } + +With Compass it's easier to use the `border-radius` mixin: + + .round { + @include border-radius(4px); + } + +That mixin will create all of the vendor prefixed CSS properties you need, with much less of a chance of a typo or inconsistent display. It will also take care of any browser specific implementations of the CSS property that don't match up to the W3C specification. + + .round { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -o-border-radius: 4px; + -ms-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + } + +## Problem + +The problem with that solution, as good as it is, is that all of those browser prefixes will cruft up your stylesheet quickly if you use a lot of them, and/or aren't using `@extend` to keep them to a minimum. + +Of particular note are the generated Opera `(-o-border-radius)` and Konquerer `(-khtml-border-radius)` properties, which are added to create support for those browsers. As great as those browsers may be, they often account for a very small minority of a website's traffic, traffic that may not compensate for the full weight of their support when using experimental CSS3 properties. + +## Solution + +Thankfully, Compass includes a selection of default boolean variables that you can override, allowing you to globally turn off the support for the various vendor prefixes: + + $experimental-support-for-mozilla : true !default; + $experimental-support-for-webkit : true !default; + $support-for-original-webkit-gradients : true !default; + $experimental-support-for-opera : true !default; + $experimental-support-for-microsoft : true !default; + $experimental-support-for-khtml : true !default; + +If you set any of the above variables to `false`, Compass will skip those prefixes when it processes your stylesheet. + +So to exclude Opera and Konquerer vendor prefixes from your CSS, add the following code just above your include of the CSS3 module in your base SCSS file: + + $experimental-support-for-opera:false; + $experimental-support-for-khtml:false; + @import "compass/css3"; + +The resultant output will be as follow: + + .round { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; + } From 87d3bdc09dc4caa9f51041b7a60ed3c547ac9b85 Mon Sep 17 00:00:00 2001 From: Jonathan del Strother Date: Wed, 12 Oct 2011 12:26:36 +0100 Subject: [PATCH 145/290] Fix Railtie initialization when initialize_on_precompile is disabled --- lib/compass/app_integration/rails/actionpack31/railtie.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb index 041cf60a..08ae8572 100644 --- a/lib/compass/app_integration/rails/actionpack31/railtie.rb +++ b/lib/compass/app_integration/rails/actionpack31/railtie.rb @@ -76,7 +76,7 @@ end module Compass class Railtie < Rails::Railtie - initializer "compass.initialize_rails" do |app| + initializer "compass.initialize_rails", :group => :all do |app| # Configure compass for use within rails, and provide the project configuration # that came via the rails boot process. Compass::AppIntegration::Rails.check_for_double_boot! From e8becc7fee3f59e4dc3808834e4d645bad5a4f7a Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 25 Oct 2011 13:49:34 -0400 Subject: [PATCH 146/290] working on sprite importer with erb templates --- Gemfile.lock | 2 +- lib/compass/sprite_importer.rb | 56 +++---------------- lib/compass/sprite_importer/content.erb | 47 ++++++++++++++++ .../sprite_importer/generate_overrides.erb | 0 4 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 lib/compass/sprite_importer/content.erb create mode 100644 lib/compass/sprite_importer/generate_overrides.erb diff --git a/Gemfile.lock b/Gemfile.lock index 6afb9c26..5df9882b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.0.alpha.0.5e89865) + compass (0.12.0.alpha.0.71494ce) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 6b8f2d94..7f5ef41e 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -1,8 +1,14 @@ +require 'erb' module Compass class SpriteImporter < Sass::Importers::Base VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/ SPRITE_IMPORTER_REGEX = %r{((.+/)?([^\*.]+))/(.+?)\.png} VALID_EXTENSIONS = ['.png'] + + + TEMPLATE_FOLDER = File.join(File.expand_path('../', __FILE__), 'sprite_importer') + CONTENT_TEMPLATE_FILE = File.join(TEMPLATE_FOLDER, 'content.erb') + GENERATE_OVERRIDES_TEMPLATE_FILE = File.join(TEMPLATE_FOLDER, 'generate_overrides.erb') # finds all sprite files def self.find_all_sprite_map_files(path) @@ -96,55 +102,7 @@ module Compass # Generates the Sass for this sprite file def self.content_for_images(uri, name, skip_overrides = false) - <<-SCSS -@import "compass/utilities/sprites/base"; - -// General Sprite Defaults -// You can override them before you import this file. -$#{name}-sprite-base-class: ".#{name}-sprite" !default; -$#{name}-sprite-dimensions: false !default; -$#{name}-position: 0% !default; -$#{name}-spacing: 0 !default; -$#{name}-repeat: no-repeat !default; -$#{name}-prefix: '' !default; -$#{name}-clean-up: true !default; -$#{name}-layout:vertical !default; - -#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $layout: $#{name}-layout, $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) } - -// All sprites should extend this class -// The #{name}-sprite mixin will do so for you. -\#{$#{name}-sprite-base-class} { - background: $#{name}-sprites no-repeat; -} - -// Use this to set the dimensions of an element -// based on the size of the original image. -@mixin #{name}-sprite-dimensions($name) { - @include sprite-dimensions($#{name}-sprites, $name) -} - -// Move the background position to display the sprite. -@mixin #{name}-sprite-position($name, $offset-x: 0, $offset-y: 0) { - @include sprite-background-position($#{name}-sprites, $name, $offset-x, $offset-y) -} - -// Extends the sprite base class and set the background position for the desired sprite. -// It will also apply the image dimensions if $dimensions is true. -@mixin #{name}-sprite($name, $dimensions: $#{name}-sprite-dimensions, $offset-x: 0, $offset-y: 0) { - @extend \#{$#{name}-sprite-base-class}; - @include sprite($#{name}-sprites, $name, $dimensions, $offset-x, $offset-y) -} - -@mixin #{name}-sprites($sprite-names, $dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites), $offset-x: 0, $offset-y: 0) { - @include sprites($#{name}-sprites, $sprite-names, $#{name}-sprite-base-class, $dimensions, $prefix, $offset-x, $offset-y) -} - -// Generates a class for each sprited image. -@mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites), $offset-x: 0, $offset-y: 0) { - @include #{name}-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix, $offset-x, $offset-y); -} -SCSS + CONTENT_TEMPLATE ||= ERB.new(CONTENT_TEMPLATE_FILE) end # Generates the override defaults for this Sprite diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb new file mode 100644 index 00000000..68bb37fe --- /dev/null +++ b/lib/compass/sprite_importer/content.erb @@ -0,0 +1,47 @@ +@import "compass/utilities/sprites/base"; + +// General Sprite Defaults +// You can override them before you import this file. +$<%= name %>-sprite-base-class: ".<%= name %>-sprite" !default; +$<%= name %>-sprite-dimensions: false !default; +$<%= name %>-position: 0% !default; +$<%= name %>-spacing: 0 !default; +$<%= name %>-repeat: no-repeat !default; +$<%= name %>-prefix: '' !default; +$<%= name %>-clean-up: true !default; +$<%= name %>-layout:vertical !default; + +#{skip_overrides ? "$<%= name %>-sprites: sprite-map(\"<%= uri %>\", $layout: $<%= name %>-layout, $cleanup: $<%= name %>-clean-up);" : generate_overrides(uri, name) } + +// All sprites should extend this class +// The <%= name %>-sprite mixin will do so for you. +\#{$<%= name %>-sprite-base-class} { + background: $<%= name %>-sprites no-repeat; +} + +// Use this to set the dimensions of an element +// based on the size of the original image. +@mixin <%= name %>-sprite-dimensions($name) { + @include sprite-dimensions($<%= name %>-sprites, $name) +} + +// Move the background position to display the sprite. +@mixin <%= name %>-sprite-position($name, $offset-x: 0, $offset-y: 0) { + @include sprite-background-position($<%= name %>-sprites, $name, $offset-x, $offset-y) +} + +// Extends the sprite base class and set the background position for the desired sprite. +// It will also apply the image dimensions if $dimensions is true. +@mixin <%= name %>-sprite($name, $dimensions: $<%= name %>-sprite-dimensions, $offset-x: 0, $offset-y: 0) { + @extend \#{$<%= name %>-sprite-base-class}; + @include sprite($<%= name %>-sprites, $name, $dimensions, $offset-x, $offset-y) +} + +@mixin <%= name %>-sprites($sprite-names, $dimensions: $<%= name %>-sprite-dimensions, $prefix: sprite-map-name($<%= name %>-sprites), $offset-x: 0, $offset-y: 0) { + @include sprites($<%= name %>-sprites, $sprite-names, $<%= name %>-sprite-base-class, $dimensions, $prefix, $offset-x, $offset-y) +} + +// Generates a class for each sprited image. +@mixin all-<%= name %>-sprites($dimensions: $<%= name %>-sprite-dimensions, $prefix: sprite-map-name($<%= name %>-sprites), $offset-x: 0, $offset-y: 0) { + @include <%= name %>-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix, $offset-x, $offset-y); +} \ No newline at end of file diff --git a/lib/compass/sprite_importer/generate_overrides.erb b/lib/compass/sprite_importer/generate_overrides.erb new file mode 100644 index 00000000..e69de29b From 16ff623732bf1198f0262736237d09f66ecbbdd1 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 25 Oct 2011 15:55:06 -0400 Subject: [PATCH 147/290] desmelled the binding class --- lib/compass/sprite_importer.rb | 2 +- lib/compass/sprite_importer/binding.rb | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index fbda3d50..1b3fb5dc 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -105,7 +105,7 @@ module Compass # Generates the Sass for this sprite file def self.content_for_images(uri, name, skip_overrides = false) - binder = Compass::Sprites::Binding.new(:name => name, :uri => uri, :skip_overrides => skip_overrides) + binder = Compass::Sprites::Binding.new(:name => name, :uri => uri, :skip_overrides => skip_overrides, :sprite_names => sprite_names(uri)) CONTENT_TEMPLATE.result(binder.get_binding) end end diff --git a/lib/compass/sprite_importer/binding.rb b/lib/compass/sprite_importer/binding.rb index 470e23b2..3e56b585 100644 --- a/lib/compass/sprite_importer/binding.rb +++ b/lib/compass/sprite_importer/binding.rb @@ -2,10 +2,6 @@ require 'ostruct' module Compass module Sprites class Binding < OpenStruct - - def sprite_names - @sprite_names ||= Compass::SpriteImporter.sprite_names(uri) - end def get_binding binding From ab20a7b9d1e17f1e7f6efe23d61078972f689058 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 25 Oct 2011 16:14:46 -0400 Subject: [PATCH 148/290] added sass functions to allow getting the unit value demensions of a sprite image --- lib/compass/sprite_importer.rb | 2 +- lib/compass/sprite_importer/content.erb | 10 +++++++++- test/integrations/sprites_test.rb | 23 +++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 1b3fb5dc..8af0ea0c 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -105,7 +105,7 @@ module Compass # Generates the Sass for this sprite file def self.content_for_images(uri, name, skip_overrides = false) - binder = Compass::Sprites::Binding.new(:name => name, :uri => uri, :skip_overrides => skip_overrides, :sprite_names => sprite_names(uri)) + binder = Compass::Sprites::Binding.new(:name => name, :uri => uri, :skip_overrides => skip_overrides, :sprite_names => sprite_names(uri), :files => files(uri)) CONTENT_TEMPLATE.result(binder.get_binding) end end diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb index 4a9d7ef2..7146f1d6 100644 --- a/lib/compass/sprite_importer/content.erb +++ b/lib/compass/sprite_importer/content.erb @@ -23,7 +23,7 @@ $<%= name %>-layout:vertical !default; <% end %> $<%= name %>-sprites: sprite-map("<%= uri %>", - <% sprite_names.map do |sprite_name| %> + <% sprite_names.each do |sprite_name| %> $<%= name %>-<%= sprite_name %>-position: $<%= name %>-<%= sprite_name %>-position, $<%= name %>-<%= sprite_name %>-spacing: $<%= name %>-<%= sprite_name %>-spacing, $<%= name %>-<%= sprite_name %>-repeat: $<%= name %>-<%= sprite_name %>-repeat, @@ -39,6 +39,14 @@ $<%= name %>-layout:vertical !default; background: $<%= name %>-sprites no-repeat; } +//sass functions to return the demensions of a sprite image as units +<% [:width, :height].each do |demension| %> + @function <%= name %>-sprite-<%= demension %>($name) { + $file: sprite_file($<%= name %>-sprites, $name); + @return image-<%= demension %>($file); + } +<% end %> + // Use this to set the dimensions of an element // based on the size of the original image. @mixin <%= name %>-sprite-dimensions($name) { diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index a447b3c6..659f3c6e 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -718,4 +718,27 @@ class SpritesTest < Test::Unit::TestCase assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') end + it "should allow use of demension functions" do + css = render <<-SCSS + @import "squares/*.png"; + $h: squares-sprite-height(twenty-by-twenty); + $w: squares-sprite-width(twenty-by-twenty); + .div { + height:$h + 1px; + width:$w + 2px; + } + SCSS + other_css = <<-CSS + .squares-sprite { + background: url('/squares-sbbc18e2129.png') no-repeat; + } + .div { + height:21px; + width:22px; + } + CSS + assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + end + + end From 063803c5cc378661480bd5bedeec115f23e99f7e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 25 Oct 2011 16:29:36 -0400 Subject: [PATCH 149/290] updated docs for new functions --- .../content/help/tutorials/spriting.markdown | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 53966616..1578ef0c 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -62,6 +62,8 @@ is located within it. ## Nested Folders +****Note**: The use of `orange` is only for this example, "icon" represents the folder name that contains your sprites. + Sprites stored in a nested folder will use the last folder name in the path as the sprite name. Example: @@ -72,6 +74,8 @@ Example: ## Selector Control +****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. + If you want control over what selectors are generated, it is easy to do. In this example, this is done by using the magic `icon-sprite` mixin. Note that the mixin's name is dependent on the name of the folder in which you've placed your icons. @@ -98,9 +102,35 @@ And your stylesheet will compile to: .actions .save { background-position: 0 -96px; } .actions .delete { background-position: 0 0; } + +## Sass Functions + +****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. + +Getting the image dimensions of a sprite + +You can get a unit value by using the magical dimension functions `-sprite-height` and `-sprite-width` +If you are looking to just return the dimensions see the [docs](/reference/compass/utilities/sprites/base/#mixin-sprite-dimensions) + +Example: + + + @import "icon/*.png"; + $box-padding: 5px; + $height: icon-sprite-height(some_icon); + $width: icon-sprite-width(some_icon); + + .somediv { + height:$height + $box-padding; + width:$width + $box-padding; + } + + ## Magic Imports +****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. + As noted above, compass will magically create sprite stylesheets for you. Some people like magic, some people are scared by it, and others are curious about how the magic works. If you would like to avoid the magic, you can use compass to generate an import for you. On the From fa49a6b9335ad020604492e0cd0b0965401b7c2c Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 25 Oct 2011 16:33:51 -0400 Subject: [PATCH 150/290] i cant spell =( --- lib/compass/sprite_importer/content.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb index 7146f1d6..a6eb28e9 100644 --- a/lib/compass/sprite_importer/content.erb +++ b/lib/compass/sprite_importer/content.erb @@ -39,11 +39,11 @@ $<%= name %>-layout:vertical !default; background: $<%= name %>-sprites no-repeat; } -//sass functions to return the demensions of a sprite image as units -<% [:width, :height].each do |demension| %> - @function <%= name %>-sprite-<%= demension %>($name) { +//sass functions to return the dimensions of a sprite image as units +<% [:width, :height].each do |dimension| %> + @function <%= name %>-sprite-<%= dimension %>($name) { $file: sprite_file($<%= name %>-sprites, $name); - @return image-<%= demension %>($file); + @return image-<%= dimension %>($file); } <% end %> From ca4af48b7d810e9b968a28ac8786693bcbe8bca7 Mon Sep 17 00:00:00 2001 From: Noah Kantrowitz Date: Tue, 1 Nov 2011 17:45:00 -0700 Subject: [PATCH 151/290] Handle Rails adding methods to nil that it really shouldn't. --- lib/compass/configuration/inheritance.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/compass/configuration/inheritance.rb b/lib/compass/configuration/inheritance.rb index d7224ac5..d9a33862 100644 --- a/lib/compass/configuration/inheritance.rb +++ b/lib/compass/configuration/inheritance.rb @@ -137,6 +137,8 @@ module Compass def read_without_default(attribute) if set?(attribute) send("raw_#{attribute}") + elsif inherited_data.nil? + nil elsif inherited_data.respond_to?("#{attribute}_without_default") inherited_data.send("#{attribute}_without_default") elsif inherited_data.respond_to?(attribute) From eb10566e02e4539ff0bbb976db34a1cbf0028699 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 3 Nov 2011 15:45:32 -0400 Subject: [PATCH 152/290] fixed and issue with Sprokets trying to the the supreme ruler of the file paths! --- lib/compass/app_integration/rails/actionpack31/helpers.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb index 819e4242..f37acdf8 100644 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ b/lib/compass/app_integration/rails/actionpack31/helpers.rb @@ -9,10 +9,12 @@ module Compass::RailsImageFunctionPatch private def image_path_for_size(image_file) - if file = ::Rails.application.assets.find_asset(image_file) + begin + file = ::Rails.application.assets.find_asset(image_file) return file + rescue ::Sprockets::FileOutsidePaths + return super(image_file) end - super(image_file) end end From f458519e01726a28874629a9842283ebd514b2ca Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 09:19:37 -0400 Subject: [PATCH 153/290] fixes issue #602 --- Gemfile.lock | 2 +- lib/compass/sass_extensions/functions/sprites.rb | 10 +++++++--- test/integrations/sprites_test.rb | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d0e4b152..2c80ced4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.a00044c) + compass (0.12.alpha.0.eb10566) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index e6506a66..e029cdab 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -153,10 +153,14 @@ module Compass::SassExtensions::Functions::Sprites protected def convert_sprite_name(sprite) - if sprite.is_a?(Sass::Script::Color) - return Sass::Script::String.new(Sass::Script::Color::HTML4_COLORS_REVERSE[sprite.rgb]) + case sprite + when Sass::Script::Color + Sass::Script::String.new(Sass::Script::Color::HTML4_COLORS_REVERSE[sprite.rgb]) + when Sass::Script::Bool + Sass::Script::String.new(sprite.to_s) + else + sprite end - sprite end def verify_map(map, error = "sprite") diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 659f3c6e..7effd1f2 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -664,6 +664,20 @@ class SpritesTest < Test::Unit::TestCase assert_equal 2, map_files('selectors-s*.png').size, "File was removed" end + it "should generate a sprite if the sprite is a bool" do + css = render <<-SCSS + @import "bool/*.png"; + a { + @include bool-sprite(false); + } + a { + @include bool-sprite(true); + } + SCSS + assert !css.empty? + end + + it "should generate a sprite if the sprite is a colorname" do css = render <<-SCSS @import "colors/*.png"; From dc878a16a0003084d06ed2292c34de4b2e5fa51e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 09:20:22 -0400 Subject: [PATCH 154/290] forgot test files --- .../sprites/public/images/bool/false.png | Bin 0 -> 2804 bytes .../fixtures/sprites/public/images/bool/true.png | Bin 0 -> 2804 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fixtures/sprites/public/images/bool/false.png create mode 100644 test/fixtures/sprites/public/images/bool/true.png diff --git a/test/fixtures/sprites/public/images/bool/false.png b/test/fixtures/sprites/public/images/bool/false.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ae53ccadde24b58be417ca95dcb57eb6da4f1a GIT binary patch literal 2804 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 Date: Fri, 4 Nov 2011 09:42:35 -0400 Subject: [PATCH 155/290] closes #572 --- .../utilities/sprites/_sprite-img.scss | 35 +++++++++++++++---- test/integrations/sprites_test.rb | 34 ++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss b/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss index b14536be..ff90c00a 100644 --- a/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +++ b/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss @@ -28,29 +28,52 @@ $sprite-image-default-height: $sprite-default-size !default; // To reduce duplication use a sprite-bg mixin for common properties and a sprite-select mixin for positioning. @mixin sprite-img($img, $col, $row: 1, $width: $sprite-image-default-width, $height: $sprite-image-default-height, $margin: $sprite-default-margin) { @include sprite-background($img, $width, $height); - @include sprite-position($col, $row, $width, $height, $margin); } + @include sprite-position($col, $row, $width, $height, $margin); +} // Sets rules common for all sprites, assumes you want a square, but allows a rectangular region. @mixin sprite-background($img, $width: $sprite-default-size, $height: $width) { - @include sprite-background-rectangle($img, $width, $height); } + @include sprite-background-rectangle($img, $width, $height); +} // Sets rules common for all sprites, assumes a rectangular region. @mixin sprite-background-rectangle($img, $width: $sprite-image-default-width, $height: $sprite-image-default-height) { background: image-url($img) no-repeat; width: $width; height: $height; - overflow: hidden; } + overflow: hidden; +} // Allows horizontal sprite positioning optimized for a single row of sprites. @mixin sprite-column($col, $width: $sprite-image-default-width, $margin: $sprite-default-margin) { - @include sprite-position($col, 1, $width, 0px, $margin); } + @include sprite-position($col, 1, $width, 0px, $margin); +} // Allows vertical sprite positioning optimized for a single column of sprites. @mixin sprite-row($row, $height: $sprite-image-default-height, $margin: $sprite-default-margin) { - @include sprite-position(1, $row, 0px, $height, $margin); } + @include sprite-position(1, $row, 0px, $height, $margin); +} // Allows vertical and horizontal sprite positioning from a grid of equal dimensioned sprites. @mixin sprite-position($col, $row: 1, $width: $sprite-image-default-width, $height: $sprite-image-default-height, $margin: $sprite-default-margin) { $x: ($col - 1) * -$width - ($col - 1) * $margin; $y: ($row - 1) * -$height - ($row - 1) * $margin; - background-position: $x $y; } + background-position: $x $y; +} + + + +// Similar to 'sprite-replace-text-with-dimensions' but does not autmaticly set the demensions +@mixin sprite-replace-text ($map, $sprite, $dimensions: false, $offset-x: 0, $offset-y: 0) { + @include hide-text; + @include sprite($map, $sprite, $dimensions, $offset-x, $offset-y); + background-image: $map; + background-repeat: no-repeat; +} + +// Similar to 'replace-text-with-dimensions' but with sprites +// To use, create your sprite and then pass it in the `$map` param +// The name of the image in the sprite folder should be `$img-name` +@mixin sprite-replace-text-with-dimensions ($map, $sprite, $offset-x: 0, $offset-y: 0){ + @include sprite-replace-text ($map, $sprite, true, $offset-x, $offset-y); +} \ No newline at end of file diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 7effd1f2..75a21b47 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -754,5 +754,39 @@ class SpritesTest < Test::Unit::TestCase assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') end + it "should replace text with images and dimensions using sprites" do + css = render <<-SCSS + @import "colors/*.png"; + .blue { + @include sprite-replace-text($colors-sprites, blue); + } + .yellow { + @include sprite-replace-text-with-dimensions($colors-sprites, yellow); + } + SCSS + other_css = <<-CSS + .colors-sprite { + background:url('/colors-s58671cb5bb.png') no-repeat; + } + .blue { + text-indent:-119988px; + overflow:hidden; + text-align:left; + background-position:0 0; + background-image:url('/colors-s58671cb5bb.png'); + background-repeat:no-repeat;} + .yellow { + text-indent:-119988px; + overflow:hidden; + text-align:left; + background-position:0 -10px; + height:10px; + width:10px; + background-image:url('/colors-s58671cb5bb.png'); + background-repeat:no-repeat; + } + CSS + assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + end end From 7e031ec179825018786092a43fb3ee9e8287b835 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 10:14:50 -0400 Subject: [PATCH 156/290] gemfile.lock --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2c80ced4..dea0747e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.eb10566) + compass (0.12.alpha.0.57f35d4) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) From 7334285950b009bb69158ec7a6001969da830cc8 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 10:15:23 -0400 Subject: [PATCH 157/290] closes #598 enjoy your increase in bytes! --- .../compass/stylesheets/compass/_support.scss | 2 +- .../stylesheets/blueprint/css/screen.css | 1 - .../blueprint/css/single-imports/debug.css | 1 - .../stylesheets/compass/css/border_radius.css | 3 - test/fixtures/stylesheets/compass/css/box.css | 19 ------ .../stylesheets/compass/css/box_shadow.css | 3 - .../stylesheets/compass/css/columns.css | 8 --- .../compass/css/grid_background.css | 4 -- test/fixtures/stylesheets/compass/css/pie.css | 1 - .../stylesheets/compass/css/transform.css | 64 ------------------- .../stylesheets/compass/css/transition.css | 1 - .../compass/css/user-interface.css | 1 - 12 files changed, 1 insertion(+), 107 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/_support.scss b/frameworks/compass/stylesheets/compass/_support.scss index 6891b52a..61b935a6 100644 --- a/frameworks/compass/stylesheets/compass/_support.scss +++ b/frameworks/compass/stylesheets/compass/_support.scss @@ -27,7 +27,7 @@ $experimental-support-for-opera : true !default; // Support for microsoft in experimental css3 properties (-ms). $experimental-support-for-microsoft : true !default; // Support for khtml in experimental css3 properties (-khtml). -$experimental-support-for-khtml : true !default; +$experimental-support-for-khtml : false !default; // Support for svg in experimental css3 properties. // Setting this to true might add significant size to your // generated stylesheets. diff --git a/test/fixtures/stylesheets/blueprint/css/screen.css b/test/fixtures/stylesheets/blueprint/css/screen.css index d5c2ece7..2bd23ba1 100644 --- a/test/fixtures/stylesheets/blueprint/css/screen.css +++ b/test/fixtures/stylesheets/blueprint/css/screen.css @@ -672,7 +672,6 @@ input.span-24, textarea.span-24, select.span-24 { background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 18px, auto; - -khtml-background-size: 100% 18px, auto; -moz-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css index e1966afb..4240043e 100644 --- a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +++ b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css @@ -6,7 +6,6 @@ background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 18px, auto; - -khtml-background-size: 100% 18px, auto; -moz-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/border_radius.css b/test/fixtures/stylesheets/compass/css/border_radius.css index 878c5f87..36b318b9 100644 --- a/test/fixtures/stylesheets/compass/css/border_radius.css +++ b/test/fixtures/stylesheets/compass/css/border_radius.css @@ -1,5 +1,4 @@ .simple { - -khtml-border-radius: 4px 4px; -webkit-border-radius: 4px / 4px; -moz-border-radius: 4px / 4px; -ms-border-radius: 4px / 4px; @@ -7,7 +6,6 @@ border-radius: 4px / 4px; } .compound { - -khtml-border-radius: 2px 3px; -webkit-border-radius: 2px 5px / 3px 6px; -moz-border-radius: 2px 5px / 3px 6px; -ms-border-radius: 2px 5px / 3px 6px; @@ -15,7 +13,6 @@ border-radius: 2px 5px / 3px 6px; } .crazy { - -khtml-border-radius: 1px 2px; -webkit-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -moz-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -ms-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; diff --git a/test/fixtures/stylesheets/compass/css/box.css b/test/fixtures/stylesheets/compass/css/box.css index 3d2841d8..cc1bc5bc 100644 --- a/test/fixtures/stylesheets/compass/css/box.css +++ b/test/fixtures/stylesheets/compass/css/box.css @@ -1,103 +1,84 @@ .hbox { display: -webkit-box; - display: -khtml-box; display: -ms-box; display: box; -webkit-box-orient: horizontal; - -khtml-box-orient: horizontal; -ms-box-orient: horizontal; box-orient: horizontal; -webkit-box-align: stretch; - -khtml-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .hbox > * { -webkit-box-flex: 0; - -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .vbox { display: -webkit-box; - display: -khtml-box; display: -ms-box; display: box; -webkit-box-orient: vertical; - -khtml-box-orient: vertical; -ms-box-orient: vertical; box-orient: vertical; -webkit-box-align: stretch; - -khtml-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .vbox > * { -webkit-box-flex: 0; - -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .spacer { -webkit-box-flex: 1; - -khtml-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .reverse { -webkit-box-direction: reverse; - -khtml-box-direction: reverse; -ms-box-direction: reverse; box-direction: reverse; } .box-flex-0 { -webkit-box-flex: 0; - -khtml-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .box-flex-1 { -webkit-box-flex: 1; - -khtml-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .box-flex-2 { -webkit-box-flex: 2; - -khtml-box-flex: 2; -ms-box-flex: 2; box-flex: 2; } .box-flex-group-0 { -webkit-box-flex-group: 0; - -khtml-box-flex-group: 0; -ms-box-flex-group: 0; box-flex-group: 0; } .box-flex-group-1 { -webkit-box-flex-group: 1; - -khtml-box-flex-group: 1; -ms-box-flex-group: 1; box-flex-group: 1; } .box-flex-group-2 { -webkit-box-flex-group: 2; - -khtml-box-flex-group: 2; -ms-box-flex-group: 2; box-flex-group: 2; } .start { -webkit-box-pack: start; - -khtml-box-pack: start; -ms-box-pack: start; box-pack: start; } .end { -webkit-box-pack: end; - -khtml-box-pack: end; -ms-box-pack: end; box-pack: end; } .center { -webkit-box-pack: center; - -khtml-box-pack: center; -ms-box-pack: center; box-pack: center; } diff --git a/test/fixtures/stylesheets/compass/css/box_shadow.css b/test/fixtures/stylesheets/compass/css/box_shadow.css index c0e9ebb6..305f454f 100644 --- a/test/fixtures/stylesheets/compass/css/box_shadow.css +++ b/test/fixtures/stylesheets/compass/css/box_shadow.css @@ -1,17 +1,14 @@ .box-shadow { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -khtml-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } .single-box-shadow { -webkit-box-shadow: 0px 0px 5px #333333; - -khtml-box-shadow: 0px 0px 5px #333333; -moz-box-shadow: 0px 0px 5px #333333; box-shadow: 0px 0px 5px #333333; } .multiple-box-shadows { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -khtml-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } diff --git a/test/fixtures/stylesheets/compass/css/columns.css b/test/fixtures/stylesheets/compass/css/columns.css index 1aa56ca4..93dda327 100644 --- a/test/fixtures/stylesheets/compass/css/columns.css +++ b/test/fixtures/stylesheets/compass/css/columns.css @@ -1,47 +1,39 @@ .column-count { -webkit-column-count: 5; - -khtml-column-count: 5; -moz-column-count: 5; column-count: 5; } .column-gap { -webkit-column-gap: 10px; - -khtml-column-gap: 10px; -moz-column-gap: 10px; column-gap: 10px; } .column-width { -webkit-column-width: 90px; - -khtml-column-width: 90px; -moz-column-width: 90px; column-width: 90px; } .column-rule-width { -webkit-rule-width: 1px; - -khtml-rule-width: 1px; -moz-rule-width: 1px; rule-width: 1px; } .column-rule-style { -webkit-rule-style: dotted; - -khtml-rule-style: dotted; -moz-rule-style: dotted; rule-style: dotted; } .column-rule-color { -webkit-rule-color: blue; - -khtml-rule-color: blue; -moz-rule-color: blue; rule-color: blue; } .column-rule { -webkit-column-rule: 1px solid blue; - -khtml-column-rule: 1px solid blue; -moz-column-rule: 1px solid blue; column-rule: 1px solid blue; } .column-rule-spaced { -webkit-column-rule: 1px solid blue; - -khtml-column-rule: 1px solid blue; -moz-column-rule: 1px solid blue; column-rule: 1px solid blue; } diff --git a/test/fixtures/stylesheets/compass/css/grid_background.css b/test/fixtures/stylesheets/compass/css/grid_background.css index b269febf..4a5a1e99 100644 --- a/test/fixtures/stylesheets/compass/css/grid_background.css +++ b/test/fixtures/stylesheets/compass/css/grid_background.css @@ -6,7 +6,6 @@ background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); -webkit-background-size: 100% 1.5em; - -khtml-background-size: 100% 1.5em; -moz-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -28,7 +27,6 @@ background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 1.5em, auto; - -khtml-background-size: 100% 1.5em, auto; -moz-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } @@ -41,7 +39,6 @@ background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); -webkit-background-size: 100% 1.5em; - -khtml-background-size: 100% 1.5em; -moz-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -63,7 +60,6 @@ background-image: -ms-linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), -ms-linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); -webkit-background-size: 100% 1.5em, auto; - -khtml-background-size: 100% 1.5em, auto; -moz-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/pie.css b/test/fixtures/stylesheets/compass/css/pie.css index 5a4337f2..613aedcc 100644 --- a/test/fixtures/stylesheets/compass/css/pie.css +++ b/test/fixtures/stylesheets/compass/css/pie.css @@ -4,7 +4,6 @@ .bordered { -webkit-border-radius: 5px; - -khtml-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; diff --git a/test/fixtures/stylesheets/compass/css/transform.css b/test/fixtures/stylesheets/compass/css/transform.css index c7cdaa61..a6121491 100644 --- a/test/fixtures/stylesheets/compass/css/transform.css +++ b/test/fixtures/stylesheets/compass/css/transform.css @@ -1,333 +1,269 @@ .apply-origin-2d { -webkit-transform-origin: 2px 5%; - -khtml-transform-origin: 2px 5%; -moz-transform-origin: 2px 5%; -ms-transform-origin: 2px 5%; transform-origin: 2px 5%; } .apply-origin-3d { - -khtml-transform-origin: 2px 5% 2in; transform-origin: 2px 5% 2in; } .transform-origin-2d { -webkit-transform-origin: 100px 100px; - -khtml-transform-origin: 100px 100px; -moz-transform-origin: 100px 100px; -ms-transform-origin: 100px 100px; transform-origin: 100px 100px; } .transform-origin-3d { - -khtml-transform-origin: 100px 100px 100px; transform-origin: 100px 100px 100px; } .transform-2d { -webkit-transform: rotateY(20deg); - -khtml-transform: rotateY(20deg); -moz-transform: rotateY(20deg); -ms-transform: rotateY(20deg); transform: rotateY(20deg); } .transform-3d { - -khtml-transform: rotateZ(20deg); transform: rotateZ(20deg); } .perspective { - -khtml-perspective: 500; perspective: 500; } .perspective-origin { - -khtml-perspective-origin: 25% 25%; perspective-origin: 25% 25%; } .transform-style { - -khtml-transform-style: preserve-3d; transform-style: preserve-3d; } .backface-visibility { - -khtml-backface-visibility: hidden; backface-visibility: hidden; } .scale { -webkit-transform: scale(30px, 50px); - -khtml-transform: scale(30px, 50px); -moz-transform: scale(30px, 50px); -ms-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-3d { - -khtml-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-with-perspective { -webkit-transform: perspective(500) scale(30px, 50px); - -khtml-transform: perspective(500) scale(30px, 50px); -moz-transform: perspective(500) scale(30px, 50px); -ms-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-3d-with-perspective { - -khtml-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-x { -webkit-transform: scaleX(30px); - -khtml-transform: scaleX(30px); -moz-transform: scaleX(30px); -ms-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-3d { - -khtml-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-with-perspective { -webkit-transform: perspective(500) scaleX(30px); - -khtml-transform: perspective(500) scaleX(30px); -moz-transform: perspective(500) scaleX(30px); -ms-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-x-3d-with-perspective { - -khtml-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-y { -webkit-transform: scaleY(50px); - -khtml-transform: scaleY(50px); -moz-transform: scaleY(50px); -ms-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-3d { - -khtml-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-with-perspective { -webkit-transform: perspective(500) scaleY(50px); - -khtml-transform: perspective(500) scaleY(50px); -moz-transform: perspective(500) scaleY(50px); -ms-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-y-3d-with-perspective { - -khtml-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-z { - -khtml-transform: scaleZ(50px); transform: scaleZ(50px); } .scale-z-with-perspective { - -khtml-transform: perspective(500) scaleZ(50px); transform: perspective(500) scaleZ(50px); } .scale3d { - -khtml-transform: scale3d(30px, 50px, 100px); transform: scale3d(30px, 50px, 100px); } .scaled3-with-perspective { - -khtml-transform: perspective(500) scale3d(30px, 50px, 100px); transform: perspective(500) scale3d(30px, 50px, 100px); } .rotate { -webkit-transform: perspective(500) rotate(25deg); - -khtml-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-with-perspective { -webkit-transform: perspective(500) rotate(25deg); - -khtml-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-z { -webkit-transform: rotate(25deg); - -khtml-transform: rotate(25deg); -moz-transform: rotate(25deg); -ms-transform: rotate(25deg); transform: rotate(25deg); } .rotate-z-with-perspective { -webkit-transform: perspective(500) rotate(25deg); - -khtml-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-x { - -khtml-transform: rotateX(25deg); transform: rotateX(25deg); } .rotate-x-with-perspective { - -khtml-transform: perspective(500) rotateX(25deg); transform: perspective(500) rotateX(25deg); } .rotate-y { - -khtml-transform: rotateY(25deg); transform: rotateY(25deg); } .rotate-y-with-perspective { - -khtml-transform: perspective(500) rotateY(25deg); transform: perspective(500) rotateY(25deg); } .rotate-3d { - -khtml-transform: rotate3d(5, 2, 1, 75deg); transform: rotate3d(5, 2, 1, 75deg); } .rotate-3d-with-perspective { - -khtml-transform: perspective(500) rotate3d(5, 2, 1, 75deg); transform: perspective(500) rotate3d(5, 2, 1, 75deg); } .translate { -webkit-transform: translate(20px, 30%); - -khtml-transform: translate(20px, 30%); -moz-transform: translate(20px, 30%); -ms-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-with-perspective { -webkit-transform: perspective(500) translate(20px, 30%); - -khtml-transform: perspective(500) translate(20px, 30%); -moz-transform: perspective(500) translate(20px, 30%); -ms-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-3d { - -khtml-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-3d-with-perspective { - -khtml-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-x { -webkit-transform: translateX(30px); - -khtml-transform: translateX(30px); -moz-transform: translateX(30px); -ms-transform: translateX(30px); transform: translateX(30px); } .translate-x-3d { - -khtml-transform: translateX(30px); transform: translateX(30px); } .translate-x-with-perspective { -webkit-transform: perspective(500) translateX(30px); - -khtml-transform: perspective(500) translateX(30px); -moz-transform: perspective(500) translateX(30px); -ms-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-x-3d-with-perspective { - -khtml-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-y { -webkit-transform: translateY(30px); - -khtml-transform: translateY(30px); -moz-transform: translateY(30px); -ms-transform: translateY(30px); transform: translateY(30px); } .translate-y-3d { - -khtml-transform: translateY(30px); transform: translateY(30px); } .translate-y-with-perspective { -webkit-transform: perspective(500) translateY(30px); - -khtml-transform: perspective(500) translateY(30px); -moz-transform: perspective(500) translateY(30px); -ms-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-y-3d-with-perspective { - -khtml-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-z { - -khtml-transform: translateZ(30px); transform: translateZ(30px); } .translate-z-with-perspective { - -khtml-transform: perspective(500) translateZ(30px); transform: perspective(500) translateZ(30px); } .translate-3d { - -khtml-transform: translate3d(30px, 50px, 75px); transform: translate3d(30px, 50px, 75px); } .translate-3d-with-perspective { - -khtml-transform: perspective(500) translate3d(30px, 50px, 75px); transform: perspective(500) translate3d(30px, 50px, 75px); } .skew { -webkit-transform: skew(20deg, 50deg); - -khtml-transform: skew(20deg, 50deg); -moz-transform: skew(20deg, 50deg); -ms-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-3d { - -khtml-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-x { -webkit-transform: skewX(20deg); - -khtml-transform: skewX(20deg); -moz-transform: skewX(20deg); -ms-transform: skewX(20deg); transform: skewX(20deg); } .skew-x-3d { - -khtml-transform: skewX(20deg); transform: skewX(20deg); } .skew-y { -webkit-transform: skewY(20deg); - -khtml-transform: skewY(20deg); -moz-transform: skewY(20deg); -ms-transform: skewY(20deg); transform: skewY(20deg); } .skew-y-3d { - -khtml-transform: skewY(20deg); transform: skewY(20deg); } .create-transform-2d { -webkit-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); - -khtml-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -moz-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -webkit-transform-origin: 50%; - -khtml-transform-origin: 50%; -moz-transform-origin: 50%; -ms-transform-origin: 50%; transform-origin: 50%; } .create-transform-3d { -webkit-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); - -khtml-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -moz-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -webkit-transform-origin: 50% 50%; - -khtml-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; } .simple-transform { -webkit-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); - -khtml-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -moz-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -ms-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -webkit-transform-origin: 10% 10%; - -khtml-transform-origin: 10% 10%; -moz-transform-origin: 10% 10%; -ms-transform-origin: 10% 10%; transform-origin: 10% 10%; } diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 2152e1a7..64d3f8f6 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -1,6 +1,5 @@ .single-transition-without-delay { -webkit-transition: all 0.6s ease-out; - -khtml-transition: all 0.6s ease-out; -moz-transition: all 0.6s ease-out; transition: all 0.6s ease-out; } diff --git a/test/fixtures/stylesheets/compass/css/user-interface.css b/test/fixtures/stylesheets/compass/css/user-interface.css index a407c770..0fbd22ba 100644 --- a/test/fixtures/stylesheets/compass/css/user-interface.css +++ b/test/fixtures/stylesheets/compass/css/user-interface.css @@ -1,5 +1,4 @@ .user-select { -webkit-user-select: none; - -khtml-user-select: none; -o-user-select: none; user-select: none; } From bc3334bec913781d54773fc352cca9121556b517 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 10:47:31 -0400 Subject: [PATCH 158/290] you can now inline sprite images using $-inline:true; before calling the @import closes #611 --- Gemfile.lock | 2 +- .../sass_extensions/functions/sprites.rb | 17 ++++++++++++++ .../sass_extensions/sprites/sprite_methods.rb | 6 ++++- lib/compass/sprite_importer/content.erb | 12 +++++++--- test/integrations/sprites_test.rb | 23 ++++++++++++++++++- 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index dea0747e..2b1efed3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.57f35d4) + compass (0.12.alpha.0.7334285) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index e029cdab..d68fd586 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -9,6 +9,23 @@ module Compass::SassExtensions::Functions::Sprites self[variable_name.to_s.gsub(/-/,"_")] end end + # Returns the system path of the sprite file + def sprite_path(map) + Sass::Script::String.new(map.name_and_hash) + end + Sass::Script::Functions.declare :sprite_path, [:map] + + # Returns the sprite file as an inline image + # @include "icon/*.png"; + # #{$icon-sprite-base-class} { + # background-image: inline-sprite($icon-sprites); + # } + def inline_sprite(map) + verify_map(map, "sprite-url") + map.generate + inline_image(sprite_path(map)) + end + Sass::Script::Functions.declare :inline_sprite, [:map] # Creates a Compass::SassExtensions::Sprites::SpriteMap object. A sprite map, when used in a property is the same # as calling sprite-url. So the following background properties are equivalent: diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 1fc5b43d..70d85d23 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -40,10 +40,14 @@ module Compass end end end + + def name_and_hash + "#{path}-s#{uniqueness_hash}.png" + end # The on-the-disk filename of the sprite def filename - File.join(Compass.configuration.generated_images_path, "#{path}-s#{uniqueness_hash}.png") + File.join(Compass.configuration.generated_images_path, name_and_hash) end def relativize(path) diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb index a6eb28e9..ccc6144e 100644 --- a/lib/compass/sprite_importer/content.erb +++ b/lib/compass/sprite_importer/content.erb @@ -10,6 +10,7 @@ $<%= name %>-repeat: no-repeat !default; $<%= name %>-prefix: '' !default; $<%= name %>-clean-up: true !default; $<%= name %>-layout:vertical !default; +$<%= name %>-inline: false !default; <% if skip_overrides %> $<%= name %>-sprites: sprite-map("<%= uri %>", $layout: $<%= name %>-layout, $cleanup: $<%= name %>-clean-up); @@ -35,10 +36,15 @@ $<%= name %>-layout:vertical !default; // All sprites should extend this class // The <%= name %>-sprite mixin will do so for you. -#{$<%= name %>-sprite-base-class} { - background: $<%= name %>-sprites no-repeat; +@if $<%= name %>-inline { + #{$<%= name %>-sprite-base-class} { + background-image: inline-sprite($<%= name %>-sprites); + } +} @else { + #{$<%= name %>-sprite-base-class} { + background: $<%= name %>-sprites no-repeat; + } } - //sass functions to return the dimensions of a sprite image as units <% [:width, :height].each do |dimension| %> @function <%= name %>-sprite-<%= dimension %>($name) { diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 75a21b47..ca118b6a 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -774,7 +774,9 @@ class SpritesTest < Test::Unit::TestCase text-align:left; background-position:0 0; background-image:url('/colors-s58671cb5bb.png'); - background-repeat:no-repeat;} + background-repeat:no-repeat; + } + .yellow { text-indent:-119988px; overflow:hidden; @@ -788,5 +790,24 @@ class SpritesTest < Test::Unit::TestCase CSS assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') end + + it "should inline the sprite file" do + css = render <<-SCSS + $colors-inline:true; + @import "colors/*.png"; + @include all-colors-sprites; + SCSS + other_css = <<-CSS + .colors-sprite, .colors-blue, .colors-yellow { + background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAUCAAAAACRhfOKAAAAHElEQVR42mM5wQADLP8JMRlIUIvE/IdgctLTNgCHDhEQVD4ceAAAAABJRU5ErkJggg=='); + } + .colors-blue { + background-position:0 0; + }.colors-yellow { + background-position:0 -10px; + } + CSS + assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + end end From b67c471780062ac3bb235cec7cf6d2f662880dfa Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 10:51:34 -0400 Subject: [PATCH 159/290] cleaned up test file --- Gemfile.lock | 2 +- test/integrations/sprites_test.rb | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2b1efed3..6a3cdb66 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.7334285) + compass (0.12.alpha.0.bc3334b) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index ca118b6a..1b630f41 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -56,6 +56,10 @@ class SpritesTest < Test::Unit::TestCase " #{css.gsub('@charset "UTF-8";', '').gsub(/\n/, "\n ").strip}\n" end + def clean(string) + string.gsub("\n", '').gsub(' ', '') + end + it "should generate sprite classes" do css = render <<-SCSS @import "squares/*.png"; @@ -729,7 +733,7 @@ class SpritesTest < Test::Unit::TestCase background-position: 0 0; } CSS - assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + assert_correct clean(css), clean(other_css) end it "should allow use of demension functions" do @@ -751,7 +755,7 @@ class SpritesTest < Test::Unit::TestCase width:22px; } CSS - assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + assert_correct clean(css), clean(other_css) end it "should replace text with images and dimensions using sprites" do @@ -788,7 +792,7 @@ class SpritesTest < Test::Unit::TestCase background-repeat:no-repeat; } CSS - assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + assert_correct clean(css), clean(other_css) end it "should inline the sprite file" do @@ -807,7 +811,7 @@ class SpritesTest < Test::Unit::TestCase background-position:0 -10px; } CSS - assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '') + assert_correct clean(css), clean(other_css) end end From 5ac790a41924429655029fc7c5e6df9203a03a52 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 4 Nov 2011 10:55:13 -0400 Subject: [PATCH 160/290] change log --- doc-src/content/CHANGELOG.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index da287628..b45fab98 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -22,7 +22,10 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Upgrade CSS3 Pie to 1.0beta5 * log sprite generation and removal to the console * Added a new helper function `compass-env()` that returns the current compass environment (development, production) - +* Added the ability to inline a sprite image by setting `$-inline:true` before you call `@import` +* Removed `-khtml` prefixes by default you can still enable them but setting `$experimental-support-for-khtml:true;` +* Improved rails 3.1 integration +* `true` and `false` are now valid sprite names 0.12.alpha.0 (8/30/2011) ------------------------ From 730acb62f4f132a360ef5454c6815fd3f307367a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 11 Nov 2011 09:19:43 -0800 Subject: [PATCH 161/290] Remove deprecated forms of the box-shadow, text-shadow, and transition mixins. --- doc-src/content/CHANGELOG.markdown | 2 ++ .../stylesheets/compass/css3/_box-shadow.scss | 31 +++++-------------- .../compass/css3/_text-shadow.scss | 26 ++++------------ .../stylesheets/compass/css3/_transition.scss | 25 ++++----------- .../stylesheets/compass/css/text_shadow.css | 3 -- .../stylesheets/compass/sass/text_shadow.scss | 1 - 6 files changed, 21 insertions(+), 67 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index b45fab98..23a6caba 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -26,6 +26,8 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Removed `-khtml` prefixes by default you can still enable them but setting `$experimental-support-for-khtml:true;` * Improved rails 3.1 integration * `true` and `false` are now valid sprite names +* Removed deprecated forms of the box-shadow, text-shadow, and transform + mixins. 0.12.alpha.0 (8/30/2011) ------------------------ diff --git a/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss b/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss index fca9b2f6..7d3f3722 100644 --- a/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +++ b/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss @@ -40,30 +40,13 @@ $default-box-shadow-inset : false !default; $shadow-9 : false, $shadow-10: false ) { - // This has to be on a single line due to a bug in the scss parser: https://github.com/nex3/sass/issues/issue/26 - $legacy: (type-of($shadow-1) == color and type-of(if($shadow-2, $shadow-2, 0)) == number and type-of(if($shadow-3, $shadow-3, 0)) == number and type-of(if($shadow-4, $shadow-4, 0)) == number and type-of(if($shadow-5, $shadow-5, 0)) == number and ($shadow-6 == inset or type-of($shadow-6) == bool) and ($shadow-2 or $shadow-3 or $shadow-4 or $shadow-5 or $shadow-6)); - @if $legacy { - @warn "Passing separate arguments for a single shadow to box-shadow is deprecated. " + - "Pass the values as a single space-separated list, or use the single-box-shadow mixin. " + - "See http://beta.compass-style.org/help/tutorials/upgrading/antares/ for more info."; - @include single-box-shadow( - if($shadow-1, $shadow-1, $default-box-shadow-color), - if($shadow-2, $shadow-2, $default-box-shadow-h-offset), - if($shadow-3, $shadow-3, $default-box-shadow-v-offset), - if($shadow-4, $shadow-4, $default-box-shadow-blur), - if($shadow-5, $shadow-5, $default-box-shadow-spread), - if($shadow-6, $shadow-6, $default-box-shadow-inset) - ); - } - @else { - @if $shadow-1 == default { - $shadow-1 : -compass-space-list(compact(if($default-box-shadow-inset, inset, false), $default-box-shadow-h-offset, $default-box-shadow-v-offset, $default-box-shadow-blur, $default-box-shadow-spread, $default-box-shadow-color)); - } - $shadow : compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10); - @include experimental(box-shadow, $shadow, - -moz, -webkit, -o, not -ms, not -khtml, official - ); + @if $shadow-1 == default { + $shadow-1 : -compass-space-list(compact(if($default-box-shadow-inset, inset, false), $default-box-shadow-h-offset, $default-box-shadow-v-offset, $default-box-shadow-blur, $default-box-shadow-spread, $default-box-shadow-color)); } + $shadow : compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10); + @include experimental(box-shadow, $shadow, + -moz, -webkit, -o, not -ms, not -khtml, official + ); } // Provides a single cross-browser CSS box shadow for Webkit, Gecko, and CSS3. @@ -90,4 +73,4 @@ $default-box-shadow-inset : false !default; @if $inset { $full: inset $full; } @include box-shadow($full); } -} \ No newline at end of file +} diff --git a/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss b/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss index 97ee2c4c..b221f1cf 100644 --- a/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss +++ b/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss @@ -23,26 +23,12 @@ $default-text-shadow-blur: 1px !default; $shadow-9 : false, $shadow-10: false ) { - // This has to be on a single line due to a bug in the scss parser: https://github.com/nex3/sass/issues/issue/26 - $legacy: type-of($shadow-1) == color and type-of(if($shadow-2, $shadow-2, 0)) == number and type-of(if($shadow-3, $shadow-3, 0)) == number and type-of(if($shadow-4, $shadow-4, 0)) == number and ($shadow-2 or $shadow-3 or $shadow-4) and not($shadow-5 or $shadow-6 or $shadow-7 or $shadow-8 or $shadow-9 or $shadow-10); - @if $legacy { - @warn "Passing separate arguments for a single shadow to text-shadow is deprecated. " + - "Pass the values as a single space-separated list, or use the single-text-shadow mixin. " + - "See http://beta.compass-style.org/help/tutorials/upgrading/antares/ for more info."; - @include single-text-shadow( - $shadow-1, - if($shadow-2, $shadow-2, $default-text-shadow-h-offset), - if($shadow-3, $shadow-3, $default-text-shadow-v-offset), - if($shadow-4, $shadow-4, $default-text-shadow-blur) - ); - } @else { - @if $shadow-1 == default { - $shadow-1: $default-text-shadow-color $default-text-shadow-h-offset $default-text-shadow-v-offset $default-text-shadow-blur; - } - text-shadow: compact($shadow-1, $shadow-2, $shadow-3, - $shadow-4, $shadow-5, $shadow-6, - $shadow-7, $shadow-8, $shadow-9, $shadow-10); + @if $shadow-1 == default { + $shadow-1: $default-text-shadow-color $default-text-shadow-h-offset $default-text-shadow-v-offset $default-text-shadow-blur; } + text-shadow: compact($shadow-1, $shadow-2, $shadow-3, + $shadow-4, $shadow-5, $shadow-6, + $shadow-7, $shadow-8, $shadow-9, $shadow-10); } // Provides a single cross-browser CSS text shadow. @@ -57,6 +43,6 @@ $default-text-shadow-blur: 1px !default; @if $color == none { text-shadow: none; } @else { - text-shadow: $color $hoff $voff $blur; + text-shadow: $color $hoff $voff $blur; } } diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index ae98aae2..f747698b 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -123,24 +123,11 @@ $default-transition-delay: false !default; $transition-9 : false, $transition-10: false ) { - $legacy: (type-of($transition-1) == string and type-of(if($transition-2, $transition-2, 0)) == number and type-of(if($transition-3, $transition-3, '')) == string and type-of(if($transition-4, $transition-4, 0)) == number and ($transition-2 or $transition-3 or $transition-4)); - @if $legacy { - @warn "Passing separate arguments for a single transition to transition is deprecated. " + - "Pass the values as a single space-separated list, or use the single-transition mixin."; - @include single-transition( - if($transition-1, $transition-1, $default-transition-property), - if($transition-2, $transition-2, $default-transition-duration), - if($transition-3, $transition-3, $default-transition-function), - if($transition-4, $transition-4, $default-transition-delay) - ); - } - @else { - @if $transition-1 == default { - $transition-1 : -compass-space-list(compact($default-transition-property, $default-transition-duration, $default-transition-function, $default-transition-delay)); - } - $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); - @include experimental(transition, $transition, - -moz, -webkit, -o, not -ms, not -khtml, official - ); + @if $transition-1 == default { + $transition-1 : -compass-space-list(compact($default-transition-property, $default-transition-duration, $default-transition-function, $default-transition-delay)); } + $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); + @include experimental(transition, $transition, + -moz, -webkit, -o, not -ms, not -khtml, official + ); } diff --git a/test/fixtures/stylesheets/compass/css/text_shadow.css b/test/fixtures/stylesheets/compass/css/text_shadow.css index bb07037e..0384185f 100644 --- a/test/fixtures/stylesheets/compass/css/text_shadow.css +++ b/test/fixtures/stylesheets/compass/css/text_shadow.css @@ -1,6 +1,3 @@ -.legacy-text-shadow { - text-shadow: #777777 5px 5px 10px; } - .single-text-shadow { text-shadow: #aaaaaa 0px 0px 1px; } diff --git a/test/fixtures/stylesheets/compass/sass/text_shadow.scss b/test/fixtures/stylesheets/compass/sass/text_shadow.scss index c8335318..f278cce6 100644 --- a/test/fixtures/stylesheets/compass/sass/text_shadow.scss +++ b/test/fixtures/stylesheets/compass/sass/text_shadow.scss @@ -1,6 +1,5 @@ @import "compass/css3/text-shadow"; -.legacy-text-shadow { @include text-shadow(#777, 5px, 5px, 10px); } .single-text-shadow { @include single-text-shadow;} .default-text-shadow { @include text-shadow;} .multiple-text-shadows-with-default { @include text-shadow(default, 2px 2px 5px #222);} From 1cd0c41c6ffb56f167a94f006c67936fa83438ed Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 14 Nov 2011 15:56:10 -0800 Subject: [PATCH 162/290] versions and dates --- VERSION.yml | 2 +- doc-src/content/CHANGELOG.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION.yml b/VERSION.yml index 77c922d5..ee4e2ce2 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,5 +2,5 @@ :major: 0 :minor: 12 :state: alpha -:build: 0 +:build: 1 :name: Alnilam diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 23a6caba..7f2fa59c 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,7 +14,7 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.alpha.1 (UNRELEASED) +0.12.alpha.1 (11/14/2011) ------------------------- * font-files helper: Stop requiring font type when the type can be guessed from URL From 3bc39aae2b00dcdc497614b10886fab0beecf7bf Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 14 Nov 2011 15:58:21 -0800 Subject: [PATCH 163/290] typos --- doc-src/Gemfile.lock | 2 +- doc-src/content/CHANGELOG.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc-src/Gemfile.lock b/doc-src/Gemfile.lock index 89725aa2..3c071171 100644 --- a/doc-src/Gemfile.lock +++ b/doc-src/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - compass (0.12.alpha.0.64c21f6) + compass (0.12.alpha.1.1cd0c41) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 7f2fa59c..f2f07500 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -23,7 +23,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * log sprite generation and removal to the console * Added a new helper function `compass-env()` that returns the current compass environment (development, production) * Added the ability to inline a sprite image by setting `$-inline:true` before you call `@import` -* Removed `-khtml` prefixes by default you can still enable them but setting `$experimental-support-for-khtml:true;` +* Removed `-khtml` prefixes by default you can still enable them by setting `$experimental-support-for-khtml:true;` * Improved rails 3.1 integration * `true` and `false` are now valid sprite names * Removed deprecated forms of the box-shadow, text-shadow, and transform From d33585581e954da2e4b06d15bf942ae73f9756fc Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 15:07:03 -0500 Subject: [PATCH 164/290] closes #600 fixed to_path issue caused by sprokets --- Gemfile.lock | 2 +- lib/compass/sass_extensions/functions/image_size.rb | 2 +- test/units/sass_extensions_test.rb | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6a3cdb66..81dad8e4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.0.bc3334b) + compass (0.12.alpha.1.3bc39aa) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 2a804930..63f4850f 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -13,7 +13,7 @@ module Compass::SassExtensions::Functions::ImageSize class ImageProperties def initialize(file) - @file = file + @file = (file.respond_to?(:to_path) ? file.to_path : file) @file_type = File.extname(@file)[1..-1] end diff --git a/test/units/sass_extensions_test.rb b/test/units/sass_extensions_test.rb index 929bb7fe..5db28691 100644 --- a/test/units/sass_extensions_test.rb +++ b/test/units/sass_extensions_test.rb @@ -142,6 +142,16 @@ class SassExtensionsTest < Test::Unit::TestCase base64_string = File.read(File.join(Compass.configuration.fonts_path, "bgrove.base64.txt")).chomp assert_equal "url('data:font/truetype;base64,#{base64_string}') format('truetype')", evaluate("inline_font_files('bgrove.ttf', truetype)") end + + + def test_image_size_should_respond_to_to_path + object = mock() + object.expects(:to_path).returns('foo.jpg') + object.expects(:respond_to?).with(:to_path).returns(true) + + Compass::SassExtensions::Functions::ImageSize::ImageProperties.new(object) + end + protected def evaluate(value) From 32b6c7fe25d55d8441024826a2394592cf7674cd Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 15:53:20 -0500 Subject: [PATCH 165/290] fixed sorting issues with jruby and rbx --- Gemfile.lock | 7 +- .../sass_extensions/sprites/layout_methods.rb | 8 +- .../stylesheets/compass/css/sprites.css | 176 +++++++++--------- .../compass/images/flag-s8f1e8fdb9b.png | Bin 77172 -> 0 bytes 4 files changed, 101 insertions(+), 90 deletions(-) delete mode 100644 test/fixtures/stylesheets/compass/images/flag-s8f1e8fdb9b.png diff --git a/Gemfile.lock b/Gemfile.lock index 81dad8e4..b0c5ba92 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.3bc39aa) + compass (0.12.alpha.1.d335855) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -56,12 +56,16 @@ GEM erubis (2.6.6) abstract (>= 1.0.0) eventmachine (0.12.10) + eventmachine (0.12.10-java) fssm (0.2.7) gherkin (2.5.4) json (>= 1.4.6) + gherkin (2.5.4-java) + json (>= 1.4.6) haml (3.1.3) i18n (0.5.0) json (1.6.1) + json (1.6.1-java) livereload (1.6) em-dir-watcher (>= 0.1) em-websocket (>= 0.1.2) @@ -122,6 +126,7 @@ GEM tzinfo (0.3.30) PLATFORMS + java ruby DEPENDENCIES diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index d91ff85e..e2384912 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -36,7 +36,13 @@ module Compass calculate_horizontal_positions @width = width_for_horizontal_layout else - @images.sort! {|a,b| b.size <=> a.size} + @images.sort! do |a,b| + if (b.size <=> a.size) === 0 + a.name <=> b.name + else + b.size <=> a.size + end + end @width = width_for_vertical_layout calulate_vertical_postions @height = height_for_vertical_layout diff --git a/test/fixtures/stylesheets/compass/css/sprites.css b/test/fixtures/stylesheets/compass/css/sprites.css index a7461fa8..394ab443 100644 --- a/test/fixtures/stylesheets/compass/css/sprites.css +++ b/test/fixtures/stylesheets/compass/css/sprites.css @@ -1,8 +1,8 @@ .flag-sprite, #flags .us, #flags .au, #flags .ca, #flags .es, #flags .eg, #flags .ly, .flag-ad, .flag-ae, .flag-af, .flag-ag, .flag-ai, .flag-al, .flag-am, .flag-an, .flag-ao, .flag-ar, .flag-as, .flag-at, .flag-au, .flag-aw, .flag-ax, .flag-az, .flag-ba, .flag-bb, .flag-bd, .flag-be, .flag-bf, .flag-bg, .flag-bh, .flag-bi, .flag-bj, .flag-bm, .flag-bn, .flag-bo, .flag-br, .flag-bs, .flag-bt, .flag-bv, .flag-bw, .flag-by, .flag-bz, .flag-ca, .flag-catalonia, .flag-cc, .flag-cd, .flag-cf, .flag-cg, .flag-ch, .flag-ci, .flag-ck, .flag-cl, .flag-cm, .flag-cn, .flag-co, .flag-cr, .flag-cs, .flag-cu, .flag-cv, .flag-cx, .flag-cy, .flag-cz, .flag-de, .flag-dj, .flag-dk, .flag-dm, .flag-do, .flag-dz, .flag-ec, .flag-ee, .flag-eg, .flag-eh, .flag-england, .flag-er, .flag-es, .flag-et, .flag-europeanunion, .flag-fam, .flag-fi, .flag-fj, .flag-fk, .flag-fm, .flag-fo, .flag-fr, .flag-ga, .flag-gb, .flag-gd, .flag-ge, .flag-gf, .flag-gh, .flag-gi, .flag-gl, .flag-gm, .flag-gn, .flag-gp, .flag-gq, .flag-gr, .flag-gs, .flag-gt, .flag-gu, .flag-gw, .flag-gy, .flag-hk, .flag-hm, .flag-hn, .flag-hr, .flag-ht, .flag-hu, .flag-id-2, .flag-ie, .flag-il, .flag-in, .flag-io, .flag-iq, .flag-ir, .flag-is, .flag-it, .flag-jm, .flag-jo, .flag-jp, .flag-ke, .flag-kg, .flag-kh, .flag-ki, .flag-km, .flag-kn, .flag-kp, .flag-kr, .flag-kw, .flag-ky, .flag-kz, .flag-la, .flag-lb, .flag-lc, .flag-li, .flag-lk, .flag-lr, .flag-ls, .flag-lt, .flag-lu, .flag-lv, .flag-ly, .flag-ma, .flag-mc, .flag-md, .flag-me, .flag-mg, .flag-mh, .flag-mk, .flag-ml, .flag-mm, .flag-mn, .flag-mo, .flag-mp, .flag-mq, .flag-mr, .flag-ms, .flag-mt, .flag-mu, .flag-mv, .flag-mw, .flag-mx, .flag-my, .flag-mz, .flag-na, .flag-nc, .flag-ne, .flag-nf, .flag-ng, .flag-ni, .flag-nl, .flag-no, .flag-np, .flag-nr, .flag-nu, .flag-nz, .flag-om, .flag-pa, .flag-pe, .flag-pf, .flag-pg, .flag-ph, .flag-pk, .flag-pl, .flag-pm, .flag-pn, .flag-pr, .flag-ps, .flag-pt, .flag-pw, .flag-py, .flag-qa, .flag-re, .flag-ro, .flag-rs, .flag-ru, .flag-rw, .flag-sa, .flag-sb, .flag-sc, .flag-scotland, .flag-sd, .flag-se, .flag-sg, .flag-sh, .flag-si, .flag-sj, .flag-sk, .flag-sl, .flag-sm, .flag-sn, .flag-so, .flag-sr, .flag-st, .flag-sv, .flag-sy, .flag-sz, .flag-tc, .flag-td, .flag-tf, .flag-tg, .flag-th, .flag-tj, .flag-tk, .flag-tl, .flag-tm, .flag-tn, .flag-to, .flag-tr, .flag-tt, .flag-tv, .flag-tw, .flag-tz, .flag-ua, .flag-ug, .flag-um, .flag-us, .flag-uy, .flag-uz, .flag-va, .flag-vc, .flag-ve, .flag-vg, .flag-vi, .flag-vn, .flag-vu, .flag-wales, .flag-wf, .flag-ws, .flag-ye, .flag-yt, .flag-za, .flag-zm, .flag-zw { - background: url('/images/flag-s8f1e8fdb9b.png') no-repeat; } + background: url('/images/flag-s4798b5a210.png') no-repeat; } #flags .us { - background-position: 0 -407px; + background-position: 0 -429px; height: 11px; width: 16px; } #flags .au { @@ -14,7 +14,7 @@ height: 11px; width: 16px; } #flags .es { - background-position: 0 -2124px; + background-position: 0 -2113px; height: 11px; width: 16px; } #flags .eg { @@ -37,12 +37,12 @@ width: 16px; } .flag-af { - background-position: 0 -1045px; + background-position: 0 -1034px; height: 11px; width: 16px; } .flag-ag { - background-position: 0 -759px; + background-position: 0 -737px; height: 11px; width: 16px; } @@ -52,7 +52,7 @@ width: 16px; } .flag-al { - background-position: 0 -902px; + background-position: 0 -891px; height: 11px; width: 16px; } @@ -72,7 +72,7 @@ width: 16px; } .flag-ar { - background-position: 0 -1739px; + background-position: 0 -1728px; height: 11px; width: 16px; } @@ -92,12 +92,12 @@ width: 16px; } .flag-aw { - background-position: 0 -1386px; + background-position: 0 -1353px; height: 11px; width: 16px; } .flag-ax { - background-position: 0 -528px; + background-position: 0 -517px; height: 11px; width: 16px; } @@ -112,12 +112,12 @@ width: 16px; } .flag-bb { - background-position: 0 -1254px; + background-position: 0 -1243px; height: 11px; width: 16px; } .flag-bd { - background-position: 0 -1662px; + background-position: 0 -1629px; height: 11px; width: 16px; } @@ -127,7 +127,7 @@ width: 16px; } .flag-bf { - background-position: 0 -2168px; + background-position: 0 -2157px; height: 11px; width: 16px; } @@ -162,7 +162,7 @@ width: 16px; } .flag-bo { - background-position: 0 -2179px; + background-position: 0 -2168px; height: 11px; width: 16px; } @@ -172,7 +172,7 @@ width: 16px; } .flag-bs { - background-position: 0 -1408px; + background-position: 0 -1397px; height: 11px; width: 16px; } @@ -182,17 +182,17 @@ width: 16px; } .flag-bv { - background-position: 0 -1276px; + background-position: 0 -1265px; height: 11px; width: 16px; } .flag-bw { - background-position: 0 -2355px; + background-position: 0 -2333px; height: 11px; width: 16px; } .flag-by { - background-position: 0 -1463px; + background-position: 0 -1452px; height: 11px; width: 16px; } @@ -227,7 +227,7 @@ width: 16px; } .flag-cg { - background-position: 0 -1541px; + background-position: 0 -1530px; height: 11px; width: 16px; } @@ -242,17 +242,17 @@ width: 16px; } .flag-ck { - background-position: 0 -473px; + background-position: 0 -462px; height: 11px; width: 16px; } .flag-cl { - background-position: 0 -2399px; + background-position: 0 -2388px; height: 11px; width: 16px; } .flag-cm { - background-position: 0 -2069px; + background-position: 0 -2047px; height: 11px; width: 16px; } @@ -267,7 +267,7 @@ width: 16px; } .flag-cr { - background-position: 0 -2036px; + background-position: 0 -2025px; height: 11px; width: 16px; } @@ -287,7 +287,7 @@ width: 16px; } .flag-cx { - background-position: 0 -418px; + background-position: 0 -407px; height: 11px; width: 16px; } @@ -297,7 +297,7 @@ width: 16px; } .flag-cz { - background-position: 0 -1717px; + background-position: 0 -1706px; height: 11px; width: 16px; } @@ -312,7 +312,7 @@ width: 16px; } .flag-dk { - background-position: 0 -1970px; + background-position: 0 -1959px; height: 11px; width: 16px; } @@ -322,7 +322,7 @@ width: 16px; } .flag-do { - background-position: 0 -1783px; + background-position: 0 -1772px; height: 11px; width: 16px; } @@ -337,7 +337,7 @@ width: 16px; } .flag-ee { - background-position: 0 -2575px; + background-position: 0 -2564px; height: 11px; width: 16px; } @@ -347,22 +347,22 @@ width: 16px; } .flag-eh { - background-position: 0 -1419px; + background-position: 0 -1408px; height: 11px; width: 16px; } .flag-england { - background-position: 0 -1574px; + background-position: 0 -1563px; height: 11px; width: 16px; } .flag-er { - background-position: 0 -429px; + background-position: 0 -418px; height: 11px; width: 16px; } .flag-es { - background-position: 0 -2124px; + background-position: 0 -2113px; height: 11px; width: 16px; } @@ -372,7 +372,7 @@ width: 16px; } .flag-europeanunion { - background-position: 0 -1243px; + background-position: 0 -1254px; height: 11px; width: 16px; } @@ -382,7 +382,7 @@ width: 16px; } .flag-fi { - background-position: 0 -1772px; + background-position: 0 -1783px; height: 11px; width: 16px; } @@ -397,17 +397,17 @@ width: 16px; } .flag-fm { - background-position: 0 -1166px; + background-position: 0 -1144px; height: 11px; width: 16px; } .flag-fo { - background-position: 0 -1596px; + background-position: 0 -1585px; height: 11px; width: 16px; } .flag-fr { - background-position: 0 -1673px; + background-position: 0 -1640px; height: 11px; width: 16px; } @@ -427,17 +427,17 @@ width: 16px; } .flag-ge { - background-position: 0 -462px; + background-position: 0 -473px; height: 11px; width: 16px; } .flag-gf { - background-position: 0 -1640px; + background-position: 0 -1651px; height: 11px; width: 16px; } .flag-gh { - background-position: 0 -2267px; + background-position: 0 -2256px; height: 11px; width: 16px; } @@ -447,7 +447,7 @@ width: 16px; } .flag-gl { - background-position: 0 -1992px; + background-position: 0 -1981px; height: 11px; width: 16px; } @@ -462,7 +462,7 @@ width: 16px; } .flag-gp { - background-position: 0 -1904px; + background-position: 0 -1893px; height: 11px; width: 16px; } @@ -472,7 +472,7 @@ width: 16px; } .flag-gr { - background-position: 0 -1397px; + background-position: 0 -1419px; height: 11px; width: 16px; } @@ -482,7 +482,7 @@ width: 16px; } .flag-gt { - background-position: 0 -2212px; + background-position: 0 -2201px; height: 11px; width: 16px; } @@ -522,12 +522,12 @@ width: 16px; } .flag-ht { - background-position: 0 -2333px; + background-position: 0 -2344px; height: 11px; width: 16px; } .flag-hu { - background-position: 0 -2619px; + background-position: 0 -2608px; height: 11px; width: 16px; } @@ -547,7 +547,7 @@ width: 16px; } .flag-in { - background-position: 0 -1585px; + background-position: 0 -1596px; height: 11px; width: 16px; } @@ -602,7 +602,7 @@ width: 16px; } .flag-kh { - background-position: 0 -1034px; + background-position: 0 -1045px; height: 11px; width: 16px; } @@ -617,12 +617,12 @@ width: 16px; } .flag-kn { - background-position: 0 -517px; + background-position: 0 -528px; height: 11px; width: 16px; } .flag-kp { - background-position: 0 -1012px; + background-position: 0 -1001px; height: 11px; width: 16px; } @@ -632,7 +632,7 @@ width: 16px; } .flag-kw { - background-position: 0 -1981px; + background-position: 0 -1992px; height: 11px; width: 16px; } @@ -642,12 +642,12 @@ width: 16px; } .flag-kz { - background-position: 0 -715px; + background-position: 0 -704px; height: 11px; width: 16px; } .flag-la { - background-position: 0 -1111px; + background-position: 0 -1100px; height: 11px; width: 16px; } @@ -687,7 +687,7 @@ width: 16px; } .flag-lu { - background-position: 0 -2201px; + background-position: 0 -2212px; height: 11px; width: 16px; } @@ -702,7 +702,7 @@ width: 16px; } .flag-ma { - background-position: 0 -2608px; + background-position: 0 -2619px; height: 11px; width: 16px; } @@ -717,7 +717,7 @@ width: 16px; } .flag-me { - background-position: 0 -1518px; + background-position: 0 -1507px; height: 12px; width: 16px; } @@ -742,7 +742,7 @@ width: 16px; } .flag-mm { - background-position: 0 -2256px; + background-position: 0 -2267px; height: 11px; width: 16px; } @@ -752,7 +752,7 @@ width: 16px; } .flag-mo { - background-position: 0 -737px; + background-position: 0 -759px; height: 11px; width: 16px; } @@ -822,7 +822,7 @@ width: 16px; } .flag-ne { - background-position: 0 -1353px; + background-position: 0 -1386px; height: 11px; width: 16px; } @@ -832,7 +832,7 @@ width: 16px; } .flag-ng { - background-position: 0 -2157px; + background-position: 0 -2179px; height: 11px; width: 16px; } @@ -847,7 +847,7 @@ width: 16px; } .flag-no { - background-position: 0 -1287px; + background-position: 0 -1276px; height: 11px; width: 16px; } @@ -892,7 +892,7 @@ width: 16px; } .flag-pg { - background-position: 0 -924px; + background-position: 0 -913px; height: 11px; width: 16px; } @@ -927,7 +927,7 @@ width: 16px; } .flag-ps { - background-position: 0 -2047px; + background-position: 0 -2069px; height: 11px; width: 16px; } @@ -937,22 +937,22 @@ width: 16px; } .flag-pw { - background-position: 0 -1001px; + background-position: 0 -1012px; height: 11px; width: 16px; } .flag-py { - background-position: 0 -2113px; + background-position: 0 -2124px; height: 11px; width: 16px; } .flag-qa { - background-position: 0 -2025px; + background-position: 0 -2036px; height: 11px; width: 16px; } .flag-re { - background-position: 0 -1651px; + background-position: 0 -1662px; height: 11px; width: 16px; } @@ -967,12 +967,12 @@ width: 16px; } .flag-ru { - background-position: 0 -2564px; + background-position: 0 -2575px; height: 11px; width: 16px; } .flag-rw { - background-position: 0 -1530px; + background-position: 0 -1541px; height: 11px; width: 16px; } @@ -997,37 +997,37 @@ width: 16px; } .flag-sd { - background-position: 0 -1750px; + background-position: 0 -1739px; height: 11px; width: 16px; } .flag-se { - background-position: 0 -1452px; + background-position: 0 -1463px; height: 11px; width: 16px; } .flag-sg { - background-position: 0 -1959px; + background-position: 0 -1970px; height: 11px; width: 16px; } .flag-sh { - background-position: 0 -209px; + background-position: 0 -198px; height: 11px; width: 16px; } .flag-si { - background-position: 0 -1507px; + background-position: 0 -1519px; height: 11px; width: 16px; } .flag-sj { - background-position: 0 -1265px; + background-position: 0 -1287px; height: 11px; width: 16px; } .flag-sk { - background-position: 0 -891px; + background-position: 0 -902px; height: 11px; width: 16px; } @@ -1042,7 +1042,7 @@ width: 16px; } .flag-sn { - background-position: 0 -1893px; + background-position: 0 -1904px; height: 11px; width: 16px; } @@ -1052,7 +1052,7 @@ width: 16px; } .flag-sr { - background-position: 0 -1706px; + background-position: 0 -1717px; height: 11px; width: 16px; } @@ -1062,7 +1062,7 @@ width: 16px; } .flag-sv { - background-position: 0 -1629px; + background-position: 0 -1673px; height: 11px; width: 16px; } @@ -1082,7 +1082,7 @@ width: 16px; } .flag-td { - background-position: 0 -1563px; + background-position: 0 -1574px; height: 11px; width: 16px; } @@ -1097,7 +1097,7 @@ width: 16px; } .flag-th { - background-position: 0 -2344px; + background-position: 0 -2355px; height: 11px; width: 16px; } @@ -1132,7 +1132,7 @@ width: 16px; } .flag-tr { - background-position: 0 -1728px; + background-position: 0 -1750px; height: 11px; width: 16px; } @@ -1172,12 +1172,12 @@ width: 16px; } .flag-us { - background-position: 0 -407px; + background-position: 0 -429px; height: 11px; width: 16px; } .flag-uy { - background-position: 0 -1144px; + background-position: 0 -1166px; height: 11px; width: 16px; } @@ -1197,7 +1197,7 @@ width: 16px; } .flag-ve { - background-position: 0 -1100px; + background-position: 0 -1111px; height: 11px; width: 16px; } @@ -1212,7 +1212,7 @@ width: 16px; } .flag-vn { - background-position: 0 -2388px; + background-position: 0 -2399px; height: 11px; width: 16px; } @@ -1227,7 +1227,7 @@ width: 16px; } .flag-wf { - background-position: 0 -913px; + background-position: 0 -924px; height: 11px; width: 16px; } @@ -1242,12 +1242,12 @@ width: 16px; } .flag-yt { - background-position: 0 -704px; + background-position: 0 -715px; height: 11px; width: 16px; } .flag-za { - background-position: 0 -198px; + background-position: 0 -209px; height: 11px; width: 16px; } diff --git a/test/fixtures/stylesheets/compass/images/flag-s8f1e8fdb9b.png b/test/fixtures/stylesheets/compass/images/flag-s8f1e8fdb9b.png deleted file mode 100644 index 490903426e9cd023df42e85338494d8cd6081d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77172 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 iE8x)A_fKRT{rg`y3H2tL?diS%0000 Date: Thu, 17 Nov 2011 15:58:11 -0500 Subject: [PATCH 166/290] forgot test file --- .../compass/images/flag-s4798b5a210.png | Bin 0 -> 77182 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fixtures/stylesheets/compass/images/flag-s4798b5a210.png diff --git a/test/fixtures/stylesheets/compass/images/flag-s4798b5a210.png b/test/fixtures/stylesheets/compass/images/flag-s4798b5a210.png new file mode 100644 index 0000000000000000000000000000000000000000..afb0a2f87cae2196ce8ee6a65a6de1488f0ca5bf GIT binary patch literal 77182 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%0AeBV*7uy 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⁢2}YC=i0SUS65ejFfN&d zwLkn}bU{>c4#vkwT<4W*FC=lT^GsOmX`(;FIA!fK6VwQwD-2V5Oj}#Q5sY$`ln$Uo z!&6xWXz{1YX7yBdZofSSW*VN#_ulKD6Rfnvj!@Gf_?3$PPS}ZC86X zBN$ISA>TXcr2Hd*VT6IBPHylJ_{qvQm9d~W{~=%p-~P6|BLDbDzwwv99JuylI|x|i zi2J~>Coy1^PdHJge221P&!BP&`8p^xf)Uw41tzY;Q(65XibHih^n2VTjS>b1M8?t2 zmk3o{2ONwr{h<;D-f9enUNaThI7q|^U<|tm=sf{d(kT2cFnRoV7zLYHSQRL2>hXK6 st>E2r4;=!QVizmm(9`odGLHWJFIJlE-v;DjSpWb407*qoM6N<$g8F5fmH+?% literal 0 HcmV?d00001 From b2f420db6617741560ad55fcfc6112e4c265e6fb Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 16:08:23 -0500 Subject: [PATCH 167/290] updated feature for sprite change --- Gemfile.lock | 2 +- features/command_line.feature | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b0c5ba92..a23ad19a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.d335855) + compass (0.12.alpha.1.7d2d537) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/features/command_line.feature b/features/command_line.feature index da043816..69a89ced 100644 --- a/features/command_line.feature +++ b/features/command_line.feature @@ -200,7 +200,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s8f1e8fdb9b.png | + | images/flag-s4798b5a210.png | And the following files are removed: | .sass-cache/ | | tmp/border_radius.css | @@ -208,7 +208,7 @@ Feature: Command Line | tmp/box_shadow.css | | tmp/columns.css | | tmp/fonts.css | - | images/flag-s8f1e8fdb9b.png | + | images/flag-s4798b5a210.png | Scenario: Watching a project for changes Given ruby supports fork From b96789ce5b84d00657c1b6d46ee4183e76df46ca Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 18:40:42 -0500 Subject: [PATCH 168/290] fixed cucumber features --- Gemfile.lock | 2 +- features/extensions.feature | 9 +++++---- features/step_definitions/extension_steps.rb | 2 ++ lib/compass.rb | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a23ad19a..d7be551d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.7d2d537) + compass (0.12.alpha.1.b2f420d) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/features/extensions.feature b/features/extensions.feature index 89b3857c..1f1a979c 100644 --- a/features/extensions.feature +++ b/features/extensions.feature @@ -16,16 +16,17 @@ Feature: Extensions Scenario: Extensions directory for rails projects Given ruby supports fork And I'm in a newly created rails project: my_rails_project - And the "my_rails_project/vendor/plugins/compass/extensions" directory exists - And and I have a fake extension at my_rails_project/vendor/plugins/compass/extensions/testing + And I run: compass init rails + And the "vendor/plugins/compass_extensions" directory exists + And and I have a fake extension at vendor/plugins/compass_extensions/testing When I run: compass frameworks Then the list of frameworks includes "testing" @listframeworks Scenario: Shared extensions directory - Given I am using the existing project in test/fixtures/stylesheets/compass - And the "~/.compass/extensions" directory exists + Given the "~/.compass/extensions" directory exists And and I have a fake extension at ~/.compass/extensions/testing + And I am using the existing project in test/fixtures/stylesheets/compass When I run: compass frameworks Then the list of frameworks includes "testing" diff --git a/features/step_definitions/extension_steps.rb b/features/step_definitions/extension_steps.rb index 2423e482..dcf4ca50 100644 --- a/features/step_definitions/extension_steps.rb +++ b/features/step_definitions/extension_steps.rb @@ -1,8 +1,10 @@ Given /^the "([^\"]*)" directory exists$/ do |directory| + directory.gsub!('~', ENV["HOME"]) if directory.include?('~/') FileUtils.mkdir_p directory end Given /^and I have a fake extension at (.*)$/ do |directory| + directory.gsub!('~', ENV["HOME"]) if directory.include?('~/') FileUtils.mkdir_p File.join(directory, 'stylesheets') FileUtils.mkdir_p File.join(directory, 'templates/project') open(File.join(directory, 'templates/project/manifest.rb'),"w") do |f| diff --git a/lib/compass.rb b/lib/compass.rb index 2d097fcb..081b0538 100644 --- a/lib/compass.rb +++ b/lib/compass.rb @@ -17,7 +17,7 @@ module Compass def shared_extension_paths @shared_extension_paths ||= begin if ENV["HOME"] && File.directory?(ENV["HOME"]) - [File.expand_path("~/.compass/extensions")] + [File.join(ENV["HOME"], ".compass", "extensions")] else [] end From b10758142eb9738d99a1e58720b07cb218081128 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 18:59:51 -0500 Subject: [PATCH 169/290] added build status --- Gemfile.lock | 2 +- README.markdown | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d7be551d..55d3aaf1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.b2f420d) + compass (0.12.alpha.1.b96789c) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/README.markdown b/README.markdown index 0b04d84f..684c271a 100644 --- a/README.markdown +++ b/README.markdown @@ -1,4 +1,7 @@ # Compass + +Build Status: [![Build Status](https://secure.travis-ci.org/chriseppstein/compass.png)] + A [Sass][sass]-based CSS Meta-Framework that allows you to mix and match any of the following CSS frameworks: - [Compass Core][compass_core_website] - [Wiki Documentation][compass_core_wiki] From db61efc78f0f32e0d77818fa3efc18cd3b3b8749 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 17 Nov 2011 19:02:49 -0500 Subject: [PATCH 170/290] tweatk readme --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 684c271a..a804a069 100644 --- a/README.markdown +++ b/README.markdown @@ -1,6 +1,6 @@ # Compass -Build Status: [![Build Status](https://secure.travis-ci.org/chriseppstein/compass.png)] +Build Status: ![Build Status](https://secure.travis-ci.org/chriseppstein/compass.png) A [Sass][sass]-based CSS Meta-Framework that allows you to mix and match any of the following CSS frameworks: From e6d3fcd3bea95ffa7d877b39f1544707ef5ab3af Mon Sep 17 00:00:00 2001 From: Jeff Felchner Date: Thu, 17 Nov 2011 00:04:34 -0600 Subject: [PATCH 171/290] Arguments order differs from the standard order being passed to --- .../compass/stylesheets/compass/css3/_shared.scss | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_shared.scss b/frameworks/compass/stylesheets/compass/css3/_shared.scss index 57223d6d..1f55cb55 100644 --- a/frameworks/compass/stylesheets/compass/css3/_shared.scss +++ b/frameworks/compass/stylesheets/compass/css3/_shared.scss @@ -5,11 +5,11 @@ // the implementations are identical except for the property // prefix. @mixin experimental($property, $value, - $webkit : $experimental-support-for-webkit, - $khtml : $experimental-support-for-khtml, $moz : $experimental-support-for-mozilla, - $ms : $experimental-support-for-microsoft, + $webkit : $experimental-support-for-webkit, $o : $experimental-support-for-opera, + $ms : $experimental-support-for-microsoft, + $khtml : $experimental-support-for-khtml, $official : true ) { @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; } @@ -22,11 +22,11 @@ // Same as experimental(), but for cases when the property is the same and the value is vendorized @mixin experimental-value($property, $value, - $webkit : $experimental-support-for-webkit, - $khtml : $experimental-support-for-khtml, $moz : $experimental-support-for-mozilla, - $ms : $experimental-support-for-microsoft, + $webkit : $experimental-support-for-webkit, $o : $experimental-support-for-opera, + $ms : $experimental-support-for-microsoft, + $khtml : $experimental-support-for-khtml, $official : true ) { @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; } From f52d3078bed10c3aa2f7170d8f821a079c4bcad4 Mon Sep 17 00:00:00 2001 From: Jeff Felchner Date: Tue, 22 Nov 2011 02:08:39 -0600 Subject: [PATCH 172/290] Fix tests so that output matches the story told by the code --- .../stylesheets/blueprint/css/screen.css | 1 + .../blueprint/css/single-imports/debug.css | 1 + .../stylesheets/compass/css/border_radius.css | 6 +- test/fixtures/stylesheets/compass/css/box.css | 19 ++++++ .../stylesheets/compass/css/box_shadow.css | 3 + .../stylesheets/compass/css/columns.css | 8 +++ .../compass/css/grid_background.css | 4 ++ .../stylesheets/compass/css/transform.css | 64 +++++++++++++++++++ .../stylesheets/compass/css/transition.css | 3 +- .../compass/css/user-interface.css | 2 +- 10 files changed, 106 insertions(+), 5 deletions(-) diff --git a/test/fixtures/stylesheets/blueprint/css/screen.css b/test/fixtures/stylesheets/blueprint/css/screen.css index 2bd23ba1..391a8e02 100644 --- a/test/fixtures/stylesheets/blueprint/css/screen.css +++ b/test/fixtures/stylesheets/blueprint/css/screen.css @@ -673,6 +673,7 @@ input.span-24, textarea.span-24, select.span-24 { background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 18px, auto; -moz-background-size: 100% 18px, auto; + -o-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css index 4240043e..40b1503e 100644 --- a/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +++ b/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css @@ -7,5 +7,6 @@ background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 18px, auto; -moz-background-size: 100% 18px, auto; + -o-background-size: 100% 18px, auto; background-size: 100% 18px, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/border_radius.css b/test/fixtures/stylesheets/compass/css/border_radius.css index 36b318b9..3b2452fc 100644 --- a/test/fixtures/stylesheets/compass/css/border_radius.css +++ b/test/fixtures/stylesheets/compass/css/border_radius.css @@ -1,19 +1,19 @@ .simple { - -webkit-border-radius: 4px / 4px; + -webkit-border-radius: 4px 4px; -moz-border-radius: 4px / 4px; -ms-border-radius: 4px / 4px; -o-border-radius: 4px / 4px; border-radius: 4px / 4px; } .compound { - -webkit-border-radius: 2px 5px / 3px 6px; + -webkit-border-radius: 2px 3px; -moz-border-radius: 2px 5px / 3px 6px; -ms-border-radius: 2px 5px / 3px 6px; -o-border-radius: 2px 5px / 3px 6px; border-radius: 2px 5px / 3px 6px; } .crazy { - -webkit-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; + -webkit-border-radius: 1px 2px; -moz-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -ms-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; -o-border-radius: 1px 3px 5px 7px / 2px 4px 6px 8px; diff --git a/test/fixtures/stylesheets/compass/css/box.css b/test/fixtures/stylesheets/compass/css/box.css index cc1bc5bc..a3cc0bd4 100644 --- a/test/fixtures/stylesheets/compass/css/box.css +++ b/test/fixtures/stylesheets/compass/css/box.css @@ -1,84 +1,103 @@ .hbox { display: -webkit-box; + display: -moz-box; display: -ms-box; display: box; -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; -ms-box-orient: horizontal; box-orient: horizontal; -webkit-box-align: stretch; + -moz-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .hbox > * { -webkit-box-flex: 0; + -moz-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .vbox { display: -webkit-box; + display: -moz-box; display: -ms-box; display: box; -webkit-box-orient: vertical; + -moz-box-orient: vertical; -ms-box-orient: vertical; box-orient: vertical; -webkit-box-align: stretch; + -moz-box-align: stretch; -ms-box-align: stretch; box-align: stretch; } .vbox > * { -webkit-box-flex: 0; + -moz-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .spacer { -webkit-box-flex: 1; + -moz-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .reverse { -webkit-box-direction: reverse; + -moz-box-direction: reverse; -ms-box-direction: reverse; box-direction: reverse; } .box-flex-0 { -webkit-box-flex: 0; + -moz-box-flex: 0; -ms-box-flex: 0; box-flex: 0; } .box-flex-1 { -webkit-box-flex: 1; + -moz-box-flex: 1; -ms-box-flex: 1; box-flex: 1; } .box-flex-2 { -webkit-box-flex: 2; + -moz-box-flex: 2; -ms-box-flex: 2; box-flex: 2; } .box-flex-group-0 { -webkit-box-flex-group: 0; + -moz-box-flex-group: 0; -ms-box-flex-group: 0; box-flex-group: 0; } .box-flex-group-1 { -webkit-box-flex-group: 1; + -moz-box-flex-group: 1; -ms-box-flex-group: 1; box-flex-group: 1; } .box-flex-group-2 { -webkit-box-flex-group: 2; + -moz-box-flex-group: 2; -ms-box-flex-group: 2; box-flex-group: 2; } .start { -webkit-box-pack: start; + -moz-box-pack: start; -ms-box-pack: start; box-pack: start; } .end { -webkit-box-pack: end; + -moz-box-pack: end; -ms-box-pack: end; box-pack: end; } .center { -webkit-box-pack: center; + -moz-box-pack: center; -ms-box-pack: center; box-pack: center; } diff --git a/test/fixtures/stylesheets/compass/css/box_shadow.css b/test/fixtures/stylesheets/compass/css/box_shadow.css index 305f454f..f92df4ca 100644 --- a/test/fixtures/stylesheets/compass/css/box_shadow.css +++ b/test/fixtures/stylesheets/compass/css/box_shadow.css @@ -1,14 +1,17 @@ .box-shadow { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } .single-box-shadow { -webkit-box-shadow: 0px 0px 5px #333333; -moz-box-shadow: 0px 0px 5px #333333; + -o-box-shadow: 0px 0px 5px #333333; box-shadow: 0px 0px 5px #333333; } .multiple-box-shadows { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; + -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } diff --git a/test/fixtures/stylesheets/compass/css/columns.css b/test/fixtures/stylesheets/compass/css/columns.css index 93dda327..e94dddd6 100644 --- a/test/fixtures/stylesheets/compass/css/columns.css +++ b/test/fixtures/stylesheets/compass/css/columns.css @@ -1,39 +1,47 @@ .column-count { -webkit-column-count: 5; -moz-column-count: 5; + -o-column-count: 5; column-count: 5; } .column-gap { -webkit-column-gap: 10px; -moz-column-gap: 10px; + -o-column-gap: 10px; column-gap: 10px; } .column-width { -webkit-column-width: 90px; -moz-column-width: 90px; + -o-column-width: 90px; column-width: 90px; } .column-rule-width { -webkit-rule-width: 1px; -moz-rule-width: 1px; + -o-rule-width: 1px; rule-width: 1px; } .column-rule-style { -webkit-rule-style: dotted; -moz-rule-style: dotted; + -o-rule-style: dotted; rule-style: dotted; } .column-rule-color { -webkit-rule-color: blue; -moz-rule-color: blue; + -o-rule-color: blue; rule-color: blue; } .column-rule { -webkit-column-rule: 1px solid blue; -moz-column-rule: 1px solid blue; + -o-column-rule: 1px solid blue; column-rule: 1px solid blue; } .column-rule-spaced { -webkit-column-rule: 1px solid blue; -moz-column-rule: 1px solid blue; + -o-column-rule: 1px solid blue; column-rule: 1px solid blue; } diff --git a/test/fixtures/stylesheets/compass/css/grid_background.css b/test/fixtures/stylesheets/compass/css/grid_background.css index 4a5a1e99..30d13f05 100644 --- a/test/fixtures/stylesheets/compass/css/grid_background.css +++ b/test/fixtures/stylesheets/compass/css/grid_background.css @@ -7,6 +7,7 @@ background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); -webkit-background-size: 100% 1.5em; -moz-background-size: 100% 1.5em; + -o-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -28,6 +29,7 @@ background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 0px, rgba(100, 100, 225, 0.25) 0px, rgba(100, 100, 225, 0.25) 30px, rgba(0, 0, 0, 0) 30px, rgba(0, 0, 0, 0) 40px, rgba(100, 100, 225, 0.25) 40px, rgba(100, 100, 225, 0.25) 70px, rgba(0, 0, 0, 0) 70px, rgba(0, 0, 0, 0) 80px, rgba(100, 100, 225, 0.25) 80px, rgba(100, 100, 225, 0.25) 110px, rgba(0, 0, 0, 0) 110px, rgba(0, 0, 0, 0) 120px, rgba(100, 100, 225, 0.25) 120px, rgba(100, 100, 225, 0.25) 150px, rgba(0, 0, 0, 0) 150px, rgba(0, 0, 0, 0) 160px, rgba(100, 100, 225, 0.25) 160px, rgba(100, 100, 225, 0.25) 190px, rgba(0, 0, 0, 0) 190px, rgba(0, 0, 0, 0) 200px, rgba(100, 100, 225, 0.25) 200px, rgba(100, 100, 225, 0.25) 230px, rgba(0, 0, 0, 0) 230px, rgba(0, 0, 0, 0) 240px, rgba(100, 100, 225, 0.25) 240px, rgba(100, 100, 225, 0.25) 270px, rgba(0, 0, 0, 0) 270px, rgba(0, 0, 0, 0) 280px, rgba(100, 100, 225, 0.25) 280px, rgba(100, 100, 225, 0.25) 310px, rgba(0, 0, 0, 0) 310px, rgba(0, 0, 0, 0) 320px, rgba(100, 100, 225, 0.25) 320px, rgba(100, 100, 225, 0.25) 350px, rgba(0, 0, 0, 0) 350px, rgba(0, 0, 0, 0) 360px, rgba(100, 100, 225, 0.25) 360px, rgba(100, 100, 225, 0.25) 390px, rgba(0, 0, 0, 0) 390px, rgba(0, 0, 0, 0) 400px, rgba(100, 100, 225, 0.25) 400px, rgba(100, 100, 225, 0.25) 430px, rgba(0, 0, 0, 0) 430px, rgba(0, 0, 0, 0) 440px, rgba(100, 100, 225, 0.25) 440px, rgba(100, 100, 225, 0.25) 470px, rgba(0, 0, 0, 0) 470px, rgba(0, 0, 0, 0) 480px, rgba(100, 100, 225, 0.25) 480px, rgba(100, 100, 225, 0.25) 510px, rgba(0, 0, 0, 0) 510px, rgba(0, 0, 0, 0) 520px, rgba(100, 100, 225, 0.25) 520px, rgba(100, 100, 225, 0.25) 550px, rgba(0, 0, 0, 0) 550px, rgba(0, 0, 0, 0) 560px, rgba(100, 100, 225, 0.25) 560px, rgba(100, 100, 225, 0.25) 590px, rgba(0, 0, 0, 0) 590px, rgba(0, 0, 0, 0) 600px, rgba(100, 100, 225, 0.25) 600px, rgba(100, 100, 225, 0.25) 630px, rgba(0, 0, 0, 0) 630px, rgba(0, 0, 0, 0) 640px, rgba(100, 100, 225, 0.25) 640px, rgba(100, 100, 225, 0.25) 670px, rgba(0, 0, 0, 0) 670px, rgba(0, 0, 0, 0) 680px, rgba(100, 100, 225, 0.25) 680px, rgba(100, 100, 225, 0.25) 710px, rgba(0, 0, 0, 0) 710px, rgba(0, 0, 0, 0) 720px, rgba(100, 100, 225, 0.25) 720px, rgba(100, 100, 225, 0.25) 750px, rgba(0, 0, 0, 0) 750px, rgba(0, 0, 0, 0) 760px, rgba(100, 100, 225, 0.25) 760px, rgba(100, 100, 225, 0.25) 790px, rgba(0, 0, 0, 0) 790px, rgba(0, 0, 0, 0) 800px, rgba(100, 100, 225, 0.25) 800px, rgba(100, 100, 225, 0.25) 830px, rgba(0, 0, 0, 0) 830px, rgba(0, 0, 0, 0) 840px, rgba(100, 100, 225, 0.25) 840px, rgba(100, 100, 225, 0.25) 870px, rgba(0, 0, 0, 0) 870px, rgba(0, 0, 0, 0) 880px, rgba(100, 100, 225, 0.25) 880px, rgba(100, 100, 225, 0.25) 910px, rgba(0, 0, 0, 0) 910px, rgba(0, 0, 0, 0) 920px, rgba(100, 100, 225, 0.25) 920px, rgba(100, 100, 225, 0.25) 950px, rgba(0, 0, 0, 0) 950px, rgba(0, 0, 0, 0) 960px); -webkit-background-size: 100% 1.5em, auto; -moz-background-size: 100% 1.5em, auto; + -o-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } @@ -40,6 +42,7 @@ background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%); -webkit-background-size: 100% 1.5em; -moz-background-size: 100% 1.5em; + -o-background-size: 100% 1.5em; background-size: 100% 1.5em; background-position: left top; } @@ -61,6 +64,7 @@ background-image: linear-gradient(bottom, rgba(0, 0, 0, 0.5) 5%, rgba(0, 0, 0, 0) 5%), linear-gradient(left, rgba(0, 0, 0, 0) 11%, rgba(100, 100, 225, 0.25) 11%, rgba(100, 100, 225, 0.25) 16%, rgba(0, 0, 0, 0) 16%, rgba(0, 0, 0, 0) 17%, rgba(100, 100, 225, 0.25) 17%, rgba(100, 100, 225, 0.25) 22%, rgba(0, 0, 0, 0) 22%, rgba(0, 0, 0, 0) 23%, rgba(100, 100, 225, 0.25) 23%, rgba(100, 100, 225, 0.25) 28%, rgba(0, 0, 0, 0) 28%, rgba(0, 0, 0, 0) 29%, rgba(100, 100, 225, 0.25) 29%, rgba(100, 100, 225, 0.25) 34%, rgba(0, 0, 0, 0) 34%, rgba(0, 0, 0, 0) 35%, rgba(100, 100, 225, 0.25) 35%, rgba(100, 100, 225, 0.25) 40%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0) 41%, rgba(100, 100, 225, 0.25) 41%, rgba(100, 100, 225, 0.25) 46%, rgba(0, 0, 0, 0) 46%, rgba(0, 0, 0, 0) 47%, rgba(100, 100, 225, 0.25) 47%, rgba(100, 100, 225, 0.25) 52%, rgba(0, 0, 0, 0) 52%, rgba(0, 0, 0, 0) 53%, rgba(100, 100, 225, 0.25) 53%, rgba(100, 100, 225, 0.25) 58%, rgba(0, 0, 0, 0) 58%, rgba(0, 0, 0, 0) 59%, rgba(100, 100, 225, 0.25) 59%, rgba(100, 100, 225, 0.25) 64%, rgba(0, 0, 0, 0) 64%, rgba(0, 0, 0, 0) 65%, rgba(100, 100, 225, 0.25) 65%, rgba(100, 100, 225, 0.25) 70%, rgba(0, 0, 0, 0) 70%, rgba(0, 0, 0, 0) 71%, rgba(100, 100, 225, 0.25) 71%, rgba(100, 100, 225, 0.25) 76%, rgba(0, 0, 0, 0) 76%, rgba(0, 0, 0, 0) 77%, rgba(100, 100, 225, 0.25) 77%, rgba(100, 100, 225, 0.25) 82%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0) 83%, rgba(100, 100, 225, 0.25) 83%, rgba(100, 100, 225, 0.25) 88%, rgba(0, 0, 0, 0) 88%, rgba(0, 0, 0, 0) 89%, rgba(100, 100, 225, 0.25) 89%, rgba(100, 100, 225, 0.25) 94%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0) 95%, rgba(100, 100, 225, 0.25) 95%, rgba(100, 100, 225, 0.25) 100%, rgba(0, 0, 0, 0) 100%, rgba(0, 0, 0, 0) 100%); -webkit-background-size: 100% 1.5em, auto; -moz-background-size: 100% 1.5em, auto; + -o-background-size: 100% 1.5em, auto; background-size: 100% 1.5em, auto; background-position: left top; } diff --git a/test/fixtures/stylesheets/compass/css/transform.css b/test/fixtures/stylesheets/compass/css/transform.css index a6121491..d79d25a8 100644 --- a/test/fixtures/stylesheets/compass/css/transform.css +++ b/test/fixtures/stylesheets/compass/css/transform.css @@ -2,268 +2,332 @@ -webkit-transform-origin: 2px 5%; -moz-transform-origin: 2px 5%; -ms-transform-origin: 2px 5%; + -o-transform-origin: 2px 5%; transform-origin: 2px 5%; } .apply-origin-3d { + -webkit-transform-origin: 2px 5% 2in; transform-origin: 2px 5% 2in; } .transform-origin-2d { -webkit-transform-origin: 100px 100px; -moz-transform-origin: 100px 100px; -ms-transform-origin: 100px 100px; + -o-transform-origin: 100px 100px; transform-origin: 100px 100px; } .transform-origin-3d { + -webkit-transform-origin: 100px 100px 100px; transform-origin: 100px 100px 100px; } .transform-2d { -webkit-transform: rotateY(20deg); -moz-transform: rotateY(20deg); -ms-transform: rotateY(20deg); + -o-transform: rotateY(20deg); transform: rotateY(20deg); } .transform-3d { + -webkit-transform: rotateZ(20deg); transform: rotateZ(20deg); } .perspective { + -webkit-perspective: 500; perspective: 500; } .perspective-origin { + -webkit-perspective-origin: 25% 25%; perspective-origin: 25% 25%; } .transform-style { + -webkit-transform-style: preserve-3d; transform-style: preserve-3d; } .backface-visibility { + -webkit-backface-visibility: hidden; backface-visibility: hidden; } .scale { -webkit-transform: scale(30px, 50px); -moz-transform: scale(30px, 50px); -ms-transform: scale(30px, 50px); + -o-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-3d { + -webkit-transform: scale(30px, 50px); transform: scale(30px, 50px); } .scale-with-perspective { -webkit-transform: perspective(500) scale(30px, 50px); -moz-transform: perspective(500) scale(30px, 50px); -ms-transform: perspective(500) scale(30px, 50px); + -o-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-3d-with-perspective { + -webkit-transform: perspective(500) scale(30px, 50px); transform: perspective(500) scale(30px, 50px); } .scale-x { -webkit-transform: scaleX(30px); -moz-transform: scaleX(30px); -ms-transform: scaleX(30px); + -o-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-3d { + -webkit-transform: scaleX(30px); transform: scaleX(30px); } .scale-x-with-perspective { -webkit-transform: perspective(500) scaleX(30px); -moz-transform: perspective(500) scaleX(30px); -ms-transform: perspective(500) scaleX(30px); + -o-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-x-3d-with-perspective { + -webkit-transform: perspective(500) scaleX(30px); transform: perspective(500) scaleX(30px); } .scale-y { -webkit-transform: scaleY(50px); -moz-transform: scaleY(50px); -ms-transform: scaleY(50px); + -o-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-3d { + -webkit-transform: scaleY(50px); transform: scaleY(50px); } .scale-y-with-perspective { -webkit-transform: perspective(500) scaleY(50px); -moz-transform: perspective(500) scaleY(50px); -ms-transform: perspective(500) scaleY(50px); + -o-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-y-3d-with-perspective { + -webkit-transform: perspective(500) scaleY(50px); transform: perspective(500) scaleY(50px); } .scale-z { + -webkit-transform: scaleZ(50px); transform: scaleZ(50px); } .scale-z-with-perspective { + -webkit-transform: perspective(500) scaleZ(50px); transform: perspective(500) scaleZ(50px); } .scale3d { + -webkit-transform: scale3d(30px, 50px, 100px); transform: scale3d(30px, 50px, 100px); } .scaled3-with-perspective { + -webkit-transform: perspective(500) scale3d(30px, 50px, 100px); transform: perspective(500) scale3d(30px, 50px, 100px); } .rotate { -webkit-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); + -o-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-with-perspective { -webkit-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); + -o-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-z { -webkit-transform: rotate(25deg); -moz-transform: rotate(25deg); -ms-transform: rotate(25deg); + -o-transform: rotate(25deg); transform: rotate(25deg); } .rotate-z-with-perspective { -webkit-transform: perspective(500) rotate(25deg); -moz-transform: perspective(500) rotate(25deg); -ms-transform: perspective(500) rotate(25deg); + -o-transform: perspective(500) rotate(25deg); transform: perspective(500) rotate(25deg); } .rotate-x { + -webkit-transform: rotateX(25deg); transform: rotateX(25deg); } .rotate-x-with-perspective { + -webkit-transform: perspective(500) rotateX(25deg); transform: perspective(500) rotateX(25deg); } .rotate-y { + -webkit-transform: rotateY(25deg); transform: rotateY(25deg); } .rotate-y-with-perspective { + -webkit-transform: perspective(500) rotateY(25deg); transform: perspective(500) rotateY(25deg); } .rotate-3d { + -webkit-transform: rotate3d(5, 2, 1, 75deg); transform: rotate3d(5, 2, 1, 75deg); } .rotate-3d-with-perspective { + -webkit-transform: perspective(500) rotate3d(5, 2, 1, 75deg); transform: perspective(500) rotate3d(5, 2, 1, 75deg); } .translate { -webkit-transform: translate(20px, 30%); -moz-transform: translate(20px, 30%); -ms-transform: translate(20px, 30%); + -o-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-with-perspective { -webkit-transform: perspective(500) translate(20px, 30%); -moz-transform: perspective(500) translate(20px, 30%); -ms-transform: perspective(500) translate(20px, 30%); + -o-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-3d { + -webkit-transform: translate(20px, 30%); transform: translate(20px, 30%); } .translate-3d-with-perspective { + -webkit-transform: perspective(500) translate(20px, 30%); transform: perspective(500) translate(20px, 30%); } .translate-x { -webkit-transform: translateX(30px); -moz-transform: translateX(30px); -ms-transform: translateX(30px); + -o-transform: translateX(30px); transform: translateX(30px); } .translate-x-3d { + -webkit-transform: translateX(30px); transform: translateX(30px); } .translate-x-with-perspective { -webkit-transform: perspective(500) translateX(30px); -moz-transform: perspective(500) translateX(30px); -ms-transform: perspective(500) translateX(30px); + -o-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-x-3d-with-perspective { + -webkit-transform: perspective(500) translateX(30px); transform: perspective(500) translateX(30px); } .translate-y { -webkit-transform: translateY(30px); -moz-transform: translateY(30px); -ms-transform: translateY(30px); + -o-transform: translateY(30px); transform: translateY(30px); } .translate-y-3d { + -webkit-transform: translateY(30px); transform: translateY(30px); } .translate-y-with-perspective { -webkit-transform: perspective(500) translateY(30px); -moz-transform: perspective(500) translateY(30px); -ms-transform: perspective(500) translateY(30px); + -o-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-y-3d-with-perspective { + -webkit-transform: perspective(500) translateY(30px); transform: perspective(500) translateY(30px); } .translate-z { + -webkit-transform: translateZ(30px); transform: translateZ(30px); } .translate-z-with-perspective { + -webkit-transform: perspective(500) translateZ(30px); transform: perspective(500) translateZ(30px); } .translate-3d { + -webkit-transform: translate3d(30px, 50px, 75px); transform: translate3d(30px, 50px, 75px); } .translate-3d-with-perspective { + -webkit-transform: perspective(500) translate3d(30px, 50px, 75px); transform: perspective(500) translate3d(30px, 50px, 75px); } .skew { -webkit-transform: skew(20deg, 50deg); -moz-transform: skew(20deg, 50deg); -ms-transform: skew(20deg, 50deg); + -o-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-3d { + -webkit-transform: skew(20deg, 50deg); transform: skew(20deg, 50deg); } .skew-x { -webkit-transform: skewX(20deg); -moz-transform: skewX(20deg); -ms-transform: skewX(20deg); + -o-transform: skewX(20deg); transform: skewX(20deg); } .skew-x-3d { + -webkit-transform: skewX(20deg); transform: skewX(20deg); } .skew-y { -webkit-transform: skewY(20deg); -moz-transform: skewY(20deg); -ms-transform: skewY(20deg); + -o-transform: skewY(20deg); transform: skewY(20deg); } .skew-y-3d { + -webkit-transform: skewY(20deg); transform: skewY(20deg); } .create-transform-2d { -webkit-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -moz-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); + -o-transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); transform: perspective(500) scale(20px, 20px) rotateX(25deg) rotateY(25deg) rotate3d(false 50px) translateX(50px) translateZ(50deg) skew(50deg, 50%); -webkit-transform-origin: 50%; -moz-transform-origin: 50%; -ms-transform-origin: 50%; + -o-transform-origin: 50%; transform-origin: 50%; } .create-transform-3d { -webkit-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -moz-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -ms-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); + -o-transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); transform: perspective(500) scale3d(20px, 20px, 20px) rotateX(25deg) rotateY(25deg) rotateZ(25deg) rotate3d(false 50px) translate3d(50px, 50px, 50deg) skew(50deg, 50%); -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; transform-origin: 50% 50%; } .simple-transform { -webkit-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -moz-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -ms-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); + -o-transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); transform: scale(25px, 25px) rotateZ(25deg) translate(10px, 10px) skew(30deg, 30deg); -webkit-transform-origin: 10% 10%; -moz-transform-origin: 10% 10%; -ms-transform-origin: 10% 10%; + -o-transform-origin: 10% 10%; transform-origin: 10% 10%; } diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 64d3f8f6..3c3a8ae2 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -1,11 +1,12 @@ .single-transition-without-delay { -webkit-transition: all 0.6s ease-out; -moz-transition: all 0.6s ease-out; + -o-transition: all 0.6s ease-out; transition: all 0.6s ease-out; } .single-transition-with-delay { -webkit-transition: all 0.6s ease-out; -webkit-transition-delay: 0.2s; - -webkit-transition: all 0.6s ease-out 0.2s; -moz-transition: all 0.6s ease-out 0.2s; + -o-transition: all 0.6s ease-out 0.2s; transition: all 0.6s ease-out 0.2s; } diff --git a/test/fixtures/stylesheets/compass/css/user-interface.css b/test/fixtures/stylesheets/compass/css/user-interface.css index 0fbd22ba..19594c62 100644 --- a/test/fixtures/stylesheets/compass/css/user-interface.css +++ b/test/fixtures/stylesheets/compass/css/user-interface.css @@ -1,4 +1,4 @@ .user-select { -webkit-user-select: none; - -o-user-select: none; + -moz-user-select: none; user-select: none; } From 79d94647f9a00b06c4a83db02e86f5d404569baf Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 22 Nov 2011 10:42:57 -0500 Subject: [PATCH 173/290] merge closes #628 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 55d3aaf1..7e762472 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.b96789c) + compass (0.12.alpha.1.4766890) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) From 37de6efc242e7c620174c2f5d738a719e15d8c7b Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 28 Nov 2011 08:05:26 -0800 Subject: [PATCH 174/290] Fix an issue with rails 2.x due to the image_url changing modules. --- lib/compass/app_integration/rails/actionpack2x/urls.rb | 4 ++-- lib/compass/app_integration/rails/runtime.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/compass/app_integration/rails/actionpack2x/urls.rb b/lib/compass/app_integration/rails/actionpack2x/urls.rb index 9780f952..ae96d774 100644 --- a/lib/compass/app_integration/rails/actionpack2x/urls.rb +++ b/lib/compass/app_integration/rails/actionpack2x/urls.rb @@ -1,4 +1,4 @@ -module Compass::SassExtensions::Functions::Urls +module Compass::SassExtensions::Functions::Urls::ImageUrl def image_url_with_rails_integration(path, only_path = Sass::Script::Bool.new(false), cache_buster = Sass::Script::Bool.new(true)) if (@controller = Sass::Plugin.rails_controller) && @controller.respond_to?(:request) && @controller.request begin @@ -15,4 +15,4 @@ module Compass::SassExtensions::Functions::Urls end end alias_method_chain :image_url, :rails_integration -end \ No newline at end of file +end diff --git a/lib/compass/app_integration/rails/runtime.rb b/lib/compass/app_integration/rails/runtime.rb index 815fd29f..423a5eea 100644 --- a/lib/compass/app_integration/rails/runtime.rb +++ b/lib/compass/app_integration/rails/runtime.rb @@ -11,7 +11,7 @@ unless defined?(Compass::RAILS_LOADED) else require 'compass/app_integration/rails/actionpack2x' end - rescue LoadError, NameError - $stderr.puts "Compass could not access the rails environment." + rescue LoadError, NameError => e + $stderr.puts "Compass could not access the rails environment: #{e}" end end From 2dbf44c2638ad47b5b02181624fe4cd0fb3cb6ad Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 28 Nov 2011 09:08:52 -0800 Subject: [PATCH 175/290] Fix for the default path of generated images in rails 2.x --- lib/compass/app_integration/rails/configuration_defaults.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb index 146ad8cf..f089ee87 100644 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ b/lib/compass/app_integration/rails/configuration_defaults.rb @@ -79,6 +79,12 @@ module Compass http_root_relative "images" end + def default_http_generated_images_path + # Relies on the fact that this will be loaded after the "normal" + # defaults, so that method_missing finds http_root_relative + http_root_relative "images" + end + def default_http_javascripts_path http_root_relative "javascripts" end From aab827f3c4f099d1fd7e10bfe9ccc494bdf3a62c Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 28 Nov 2011 09:23:55 -0800 Subject: [PATCH 176/290] Prep for v0.12.alpha.2 --- VERSION.yml | 2 +- doc-src/content/CHANGELOG.markdown | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/VERSION.yml b/VERSION.yml index ee4e2ce2..c441c0f8 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,5 +2,5 @@ :major: 0 :minor: 12 :state: alpha -:build: 1 +:build: 2 :name: Alnilam diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index f2f07500..03fa99d7 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,6 +14,11 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.alpha.2 (11/28/2011) +------------------------- + +* Bug fixes for Rails 2.x applications. + 0.12.alpha.1 (11/14/2011) ------------------------- From 701c8d33c773352deb65e50e137591e4d552a6b3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 1 Dec 2011 14:54:39 -0500 Subject: [PATCH 177/290] fixed sass deprication error of Sass::Compiler#on_updating_stylesheet closes #635 --- Gemfile.lock | 81 ++++++++++++++-------------- lib/compass/configuration/helpers.rb | 5 +- 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7e762472..dab322c0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.1.4766890) + compass (0.12.alpha.2.aab827f) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -10,12 +10,12 @@ GEM remote: http://rubygems.org/ specs: abstract (1.0.0) - actionmailer (3.0.10) - actionpack (= 3.0.10) + actionmailer (3.0.11) + actionpack (= 3.0.11) mail (~> 2.2.19) - actionpack (3.0.10) - activemodel (= 3.0.10) - activesupport (= 3.0.10) + actionpack (3.0.11) + activemodel (= 3.0.11) + activesupport (= 3.0.11) builder (~> 2.1.2) erubis (~> 2.6.6) i18n (~> 0.5.0) @@ -23,29 +23,29 @@ GEM rack-mount (~> 0.6.14) rack-test (~> 0.5.7) tzinfo (~> 0.3.23) - activemodel (3.0.10) - activesupport (= 3.0.10) + activemodel (3.0.11) + activesupport (= 3.0.11) builder (~> 2.1.2) i18n (~> 0.5.0) - activerecord (3.0.10) - activemodel (= 3.0.10) - activesupport (= 3.0.10) + activerecord (3.0.11) + activemodel (= 3.0.11) + activesupport (= 3.0.11) arel (~> 2.0.10) tzinfo (~> 0.3.23) - activeresource (3.0.10) - activemodel (= 3.0.10) - activesupport (= 3.0.10) - activesupport (3.0.10) + activeresource (3.0.11) + activemodel (= 3.0.11) + activesupport (= 3.0.11) + activesupport (3.0.11) addressable (2.2.6) arel (2.0.10) builder (2.1.2) chunky_png (1.2.5) compass-validator (3.0.1) css_parser (1.0.1) - cucumber (1.1.0) + cucumber (1.1.3) builder (>= 2.1.2) diff-lcs (>= 1.1.2) - gherkin (~> 2.5.0) + gherkin (~> 2.6.7) json (>= 1.4.6) term-ansicolor (>= 1.0.6) diff-lcs (1.1.3) @@ -58,44 +58,44 @@ GEM eventmachine (0.12.10) eventmachine (0.12.10-java) fssm (0.2.7) - gherkin (2.5.4) + gherkin (2.6.8) json (>= 1.4.6) - gherkin (2.5.4-java) + gherkin (2.6.8-java) json (>= 1.4.6) - haml (3.1.3) + haml (3.1.4) i18n (0.5.0) - json (1.6.1) - json (1.6.1-java) - livereload (1.6) + json (1.6.3) + json (1.6.3-java) + livereload (1.6.1) em-dir-watcher (>= 0.1) - em-websocket (>= 0.1.2) - ruby-json (>= 1.1.2) + em-websocket (>= 0.3.5) + json (>= 1.5.3) mail (2.2.19) activesupport (>= 2.3.6) i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) metaclass (0.0.1) - mime-types (1.17.1) + mime-types (1.17.2) mocha (0.10.0) metaclass (~> 0.0.1) - polyglot (0.3.2) + polyglot (0.3.3) rack (1.2.4) rack-mount (0.6.14) rack (>= 1.0.0) rack-test (0.5.7) rack (>= 1.0) - rails (3.0.10) - actionmailer (= 3.0.10) - actionpack (= 3.0.10) - activerecord (= 3.0.10) - activeresource (= 3.0.10) - activesupport (= 3.0.10) + rails (3.0.11) + actionmailer (= 3.0.11) + actionpack (= 3.0.11) + activerecord (= 3.0.11) + activeresource (= 3.0.11) + activesupport (= 3.0.11) bundler (~> 1.0) - railties (= 3.0.10) - railties (3.0.10) - actionpack (= 3.0.10) - activesupport (= 3.0.10) + railties (= 3.0.11) + railties (3.0.11) + actionpack (= 3.0.11) + activesupport (= 3.0.11) rake (>= 0.8.7) rdoc (~> 3.4) thor (~> 0.14.4) @@ -113,17 +113,16 @@ GEM rspec-mocks (2.0.1) rspec-core (~> 2.0.1) rspec-expectations (~> 2.0.1) - ruby-json (1.1.2) ruby-prof (0.10.8) - rubyzip (0.9.4) - sass (3.1.10) + rubyzip (0.9.5) + sass (3.1.11) term-ansicolor (1.0.7) thor (0.14.6) timecop (0.3.5) treetop (1.4.10) polyglot polyglot (>= 0.3.1) - tzinfo (0.3.30) + tzinfo (0.3.31) PLATFORMS java diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index b0bf7d45..b1bd8907 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -67,12 +67,15 @@ module Compass end end unless @callbacks_loaded - Sass::Plugin.on_updating_stylesheet do |sass_file, css_file| + + Sass::Plugin.on_updated_stylesheet do |sass_file, css_file| Compass.configuration.run_stylesheet_saved(css_file) end + Sass::Plugin.on_compilation_error do |e, filename, css| Compass.configuration.run_stylesheet_error(filename, e.message) end + @callbacks_loaded = true end end From ac0136981a3a476906ddd52fd42fb0c1c525cff3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 1 Dec 2011 15:02:15 -0500 Subject: [PATCH 178/290] fixed cucumber deprication notice --- features/step_definitions/command_line_steps.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/step_definitions/command_line_steps.rb b/features/step_definitions/command_line_steps.rb index b7ac7860..8a0eb25b 100644 --- a/features/step_definitions/command_line_steps.rb +++ b/features/step_definitions/command_line_steps.rb @@ -136,13 +136,13 @@ end Then "the following files are reported removed:" do |table| table.rows.each do |css_file| #need to find a better way but this works for now - Then %Q{a css file #{css_file.first} is reported removed} + step %Q{a css file #{css_file.first} is reported removed} end end Then "the following files are removed:" do |table| table.rows.each do |css_file| - Then %Q{a css file #{css_file.first} is removed} + step %Q{a css file #{css_file.first} is removed} end end @@ -258,7 +258,7 @@ end Then /^I should see the following "([^"]+)" commands:$/ do |kind, table| - Then %Q{I should be shown a list of "#{kind}" commands} + step %Q{I should be shown a list of "#{kind}" commands} commands = @last_command_list.map{|c| c =~ /^\s+\* ([^ ]+)\s+- [A-Z].+$/; [$1]} table.diff!(commands) From 70ee152f798da9c273c42ef7e2cd693493262b11 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 1 Dec 2011 15:04:50 -0500 Subject: [PATCH 179/290] fixed typo via #634 --- Gemfile.lock | 2 +- lib/compass/sass_extensions/functions/image_size.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index dab322c0..8305fa03 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.2.aab827f) + compass (0.12.alpha.2.701c8d3) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/lib/compass/sass_extensions/functions/image_size.rb b/lib/compass/sass_extensions/functions/image_size.rb index 63f4850f..97bf85c3 100644 --- a/lib/compass/sass_extensions/functions/image_size.rb +++ b/lib/compass/sass_extensions/functions/image_size.rb @@ -1,13 +1,13 @@ module Compass::SassExtensions::Functions::ImageSize # Returns the width of the image relative to the images directory def image_width(image_file) - width, _ = image_demensions(image_file) + width, _ = image_dimensions(image_file) Sass::Script::Number.new(width,["px"]) end # Returns the height of the image relative to the images directory def image_height(image_file) - _, height = image_demensions(image_file) + _, height = image_dimensions(image_file) Sass::Script::Number.new(height, ["px"]) end @@ -44,7 +44,7 @@ module Compass::SassExtensions::Functions::ImageSize private - def image_demensions(image_file) + def image_dimensions(image_file) options[:compass] ||= {} options[:compass][:image_dimensions] ||= {} options[:compass][:image_dimensions][image_file.value] = ImageProperties.new(image_path_for_size(image_file.value)).size From cd5b1949dd1c3ee1f98b63d751ad1503d46d4cea Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 1 Dec 2011 15:49:49 -0500 Subject: [PATCH 180/290] -o-box-shadow does not exist closes #631 with tests --- Gemfile.lock | 2 +- frameworks/compass/stylesheets/compass/css3/_box-shadow.scss | 2 +- test/fixtures/stylesheets/compass/css/box_shadow.css | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8305fa03..1681eaa5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - compass (0.12.alpha.2.701c8d3) + compass (0.12.alpha.2.70ee152) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) diff --git a/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss b/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss index 7d3f3722..ea47dc97 100644 --- a/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +++ b/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss @@ -45,7 +45,7 @@ $default-box-shadow-inset : false !default; } $shadow : compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10); @include experimental(box-shadow, $shadow, - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, not -o, not -ms, not -khtml, official ); } diff --git a/test/fixtures/stylesheets/compass/css/box_shadow.css b/test/fixtures/stylesheets/compass/css/box_shadow.css index f92df4ca..305f454f 100644 --- a/test/fixtures/stylesheets/compass/css/box_shadow.css +++ b/test/fixtures/stylesheets/compass/css/box_shadow.css @@ -1,17 +1,14 @@ .box-shadow { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } .single-box-shadow { -webkit-box-shadow: 0px 0px 5px #333333; -moz-box-shadow: 0px 0px 5px #333333; - -o-box-shadow: 0px 0px 5px #333333; box-shadow: 0px 0px 5px #333333; } .multiple-box-shadows { -webkit-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; -moz-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; - -o-box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; box-shadow: 0px 0px 5px #333333, 2px 2px 5px #222222; } From 95358b0b8352ab263318249f7f739829a3d37fef Mon Sep 17 00:00:00 2001 From: Kyle Robinson Young Date: Wed, 7 Dec 2011 18:33:41 -0800 Subject: [PATCH 181/290] Fix typos --- doc-src/content/frameworks.haml | 2 +- doc-src/content/get-involved/index.haml | 2 +- doc-src/content/help/tutorials/extensions.markdown | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc-src/content/frameworks.haml b/doc-src/content/frameworks.haml index 22d8b3cc..2fec400d 100644 --- a/doc-src/content/frameworks.haml +++ b/doc-src/content/frameworks.haml @@ -39,7 +39,7 @@ crumb: Plugins and frameworks %a http://compass-style.org %td - You are currently vising the Compass docs. + You are currently viewing the Compass docs. %tr %td Blueprint %td 0.8.0 diff --git a/doc-src/content/get-involved/index.haml b/doc-src/content/get-involved/index.haml index 84998259..a7582fb4 100644 --- a/doc-src/content/get-involved/index.haml +++ b/doc-src/content/get-involved/index.haml @@ -19,7 +19,7 @@ layout: default 1. [**Contribute to Compass**](/help/tutorials/contributing). 2. [**Develop a Compass Extension**](/help/tutorials/extensions). - 3. [**Contribute to Sass Recipies**](http://chriseppstein.github.com/sass-recipes/). + 3. [**Contribute to Sass Recipes**](http://chriseppstein.github.com/sass-recipes/). 4. Publish your code somewhere and email a link to the [mailing list](http://groups.google.com/group/compass-users). ## Help Others diff --git a/doc-src/content/help/tutorials/extensions.markdown b/doc-src/content/help/tutorials/extensions.markdown index 791a3ed4..99e6d24d 100644 --- a/doc-src/content/help/tutorials/extensions.markdown +++ b/doc-src/content/help/tutorials/extensions.markdown @@ -125,7 +125,7 @@ should attempt to adhere to unless there's a good reason not to do so. pieces for faster load times when they're not using everything. 3. Use partials (files starting with an underscore) for stylesheets that are meant to be imported. If you do not Sass will generate css - files for your libaries in some configurations. + files for your libraries in some configurations. 4. Provide a project template. If you do not, your project should only be providing widgets or page designs, etc. From aa49b7de1bcc81635d891ad569b840c024d8f4dd Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 9 Dec 2011 20:20:45 -0500 Subject: [PATCH 182/290] removed autotest gross --- autotest/discover.rb | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 autotest/discover.rb diff --git a/autotest/discover.rb b/autotest/discover.rb deleted file mode 100644 index ee7f82c5..00000000 --- a/autotest/discover.rb +++ /dev/null @@ -1,5 +0,0 @@ -Autotest.add_discovery { 'rspec2' } - - - - From 2e6c224e80a7353eca2f00c3097791b0a3c2cca6 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 9 Dec 2011 20:41:59 -0500 Subject: [PATCH 183/290] removed Gemfile.lock yehuda commands it http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ --- Gemfile.lock | 147 --------------------------------------------------- 1 file changed, 147 deletions(-) delete mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 1681eaa5..00000000 --- a/Gemfile.lock +++ /dev/null @@ -1,147 +0,0 @@ -PATH - remote: . - specs: - compass (0.12.alpha.2.70ee152) - chunky_png (~> 1.2) - fssm (>= 0.2.7) - sass (~> 3.1) - -GEM - remote: http://rubygems.org/ - specs: - abstract (1.0.0) - actionmailer (3.0.11) - actionpack (= 3.0.11) - mail (~> 2.2.19) - actionpack (3.0.11) - activemodel (= 3.0.11) - activesupport (= 3.0.11) - builder (~> 2.1.2) - erubis (~> 2.6.6) - i18n (~> 0.5.0) - rack (~> 1.2.1) - rack-mount (~> 0.6.14) - rack-test (~> 0.5.7) - tzinfo (~> 0.3.23) - activemodel (3.0.11) - activesupport (= 3.0.11) - builder (~> 2.1.2) - i18n (~> 0.5.0) - activerecord (3.0.11) - activemodel (= 3.0.11) - activesupport (= 3.0.11) - arel (~> 2.0.10) - tzinfo (~> 0.3.23) - activeresource (3.0.11) - activemodel (= 3.0.11) - activesupport (= 3.0.11) - activesupport (3.0.11) - addressable (2.2.6) - arel (2.0.10) - builder (2.1.2) - chunky_png (1.2.5) - compass-validator (3.0.1) - css_parser (1.0.1) - cucumber (1.1.3) - builder (>= 2.1.2) - diff-lcs (>= 1.1.2) - gherkin (~> 2.6.7) - json (>= 1.4.6) - term-ansicolor (>= 1.0.6) - diff-lcs (1.1.3) - em-dir-watcher (0.9.4) - em-websocket (0.3.5) - addressable (>= 2.1.1) - eventmachine (>= 0.12.9) - erubis (2.6.6) - abstract (>= 1.0.0) - eventmachine (0.12.10) - eventmachine (0.12.10-java) - fssm (0.2.7) - gherkin (2.6.8) - json (>= 1.4.6) - gherkin (2.6.8-java) - json (>= 1.4.6) - haml (3.1.4) - i18n (0.5.0) - json (1.6.3) - json (1.6.3-java) - livereload (1.6.1) - em-dir-watcher (>= 0.1) - em-websocket (>= 0.3.5) - json (>= 1.5.3) - mail (2.2.19) - activesupport (>= 2.3.6) - i18n (>= 0.4.0) - mime-types (~> 1.16) - treetop (~> 1.4.8) - metaclass (0.0.1) - mime-types (1.17.2) - mocha (0.10.0) - metaclass (~> 0.0.1) - polyglot (0.3.3) - rack (1.2.4) - rack-mount (0.6.14) - rack (>= 1.0.0) - rack-test (0.5.7) - rack (>= 1.0) - rails (3.0.11) - actionmailer (= 3.0.11) - actionpack (= 3.0.11) - activerecord (= 3.0.11) - activeresource (= 3.0.11) - activesupport (= 3.0.11) - bundler (~> 1.0) - railties (= 3.0.11) - railties (3.0.11) - actionpack (= 3.0.11) - activesupport (= 3.0.11) - rake (>= 0.8.7) - rdoc (~> 3.4) - thor (~> 0.14.4) - rake (0.9.2.2) - rcov (0.9.11) - rdoc (3.11) - json (~> 1.4) - rspec (2.0.1) - rspec-core (~> 2.0.1) - rspec-expectations (~> 2.0.1) - rspec-mocks (~> 2.0.1) - rspec-core (2.0.1) - rspec-expectations (2.0.1) - diff-lcs (>= 1.1.2) - rspec-mocks (2.0.1) - rspec-core (~> 2.0.1) - rspec-expectations (~> 2.0.1) - ruby-prof (0.10.8) - rubyzip (0.9.5) - sass (3.1.11) - term-ansicolor (1.0.7) - thor (0.14.6) - timecop (0.3.5) - treetop (1.4.10) - polyglot - polyglot (>= 0.3.1) - tzinfo (0.3.31) - -PLATFORMS - java - ruby - -DEPENDENCIES - compass! - compass-validator (= 3.0.1) - css_parser (~> 1.0.1) - cucumber (~> 1.1.0) - diff-lcs (~> 1.1.2) - haml (~> 3.1) - livereload - mocha - rails (~> 3.0.0.rc) - rake (~> 0.9.2) - rcov - rspec (~> 2.0.0) - ruby-prof - rubyzip - sass (~> 3.1) - timecop From 1280fce2be75929a04ae9b1973aa108a039735b2 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 9 Dec 2011 20:42:31 -0500 Subject: [PATCH 184/290] added guard support --- Gemfile | 13 ++++++++++++- Guardfile | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Guardfile diff --git a/Gemfile b/Gemfile index 38a007b4..d85d3276 100644 --- a/Gemfile +++ b/Gemfile @@ -16,8 +16,19 @@ gem "ruby-prof", :platform => :mri_18 gem 'mocha' gem 'timecop' + +gem 'guard' +gem 'guard-test' +gem 'guard-cucumber' + gem 'diff-lcs', '~> 1.1.2' gem 'rake', '~> 0.9.2' -#Warning becarful adding OS dependant gems to this file it will cause issues on the CI server \ No newline at end of file +#Warning becarful adding OS dependant gems to this file it will cause issues on the CI server + + +unless ENV["CI"] + gem 'rb-fsevent' + gem 'growl_notify' +end diff --git a/Guardfile b/Guardfile new file mode 100644 index 00000000..46405604 --- /dev/null +++ b/Guardfile @@ -0,0 +1,12 @@ +guard :test do + watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^test/.+_test\.rb$}) + watch(%r{^test/units/.+_test\.rb$}) + watch('test/test_helper.rb') { "test" } +end + +guard :cucumber do + watch(%r{^features/.+\.feature$}) + watch(%r{^features/support/.+$}) { 'features' } + watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' } +end \ No newline at end of file From 4e81fafac3997a600699554aa551703dba410319 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 9 Dec 2011 21:13:18 -0500 Subject: [PATCH 185/290] extracted layout tests --- test/units/sprites/layout_test.rb | 135 ++++++++++++++++++++++++++ test/units/sprites/sprite_map_test.rb | 96 ------------------ 2 files changed, 135 insertions(+), 96 deletions(-) create mode 100644 test/units/sprites/layout_test.rb diff --git a/test/units/sprites/layout_test.rb b/test/units/sprites/layout_test.rb new file mode 100644 index 00000000..ba661216 --- /dev/null +++ b/test/units/sprites/layout_test.rb @@ -0,0 +1,135 @@ +require 'test_helper' + +class LayoutTest < Test::Unit::TestCase + include SpriteHelper + + def setup + Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader) + create_sprite_temp + file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n") + Compass.add_configuration(file, "sprite_config") + Compass.configure_sass_plugin! + @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')} + end + + def teardown + clean_up_sprites + end + + # HELPERS + + def vertical + opts = @options.merge("layout" => Sass::Script::String.new('vertical')) + + sprite_map_test(opts) + end + + def smart + options = @options.merge("layout" => Sass::Script::String.new('smart')) + importer = Compass::SpriteImporter.new + uri = "image_row/*.png" + path, name = Compass::SpriteImporter.path_and_name(uri) + sprite_names = Compass::SpriteImporter.sprite_names(uri) + sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) + map = Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map {|n| "image_row/#{n}.png"}, path, name, sass_engine, options) + map.options = {:compass => {:logger => Compass::NullLogger.new}} + + map + end + + def diagonal + opts = @options.merge("layout" => Sass::Script::String.new('diagonal')) + + sprite_map_test(opts) + end + + def horizontal(options= {}) + opts = @options.merge("layout" => Sass::Script::String.new('horizontal')) + opts.merge!(options) + + sprite_map_test(opts) + end + + # REPEAT-X + + # VERTICAL LAYOUT + + it "should have a vertical layout" do + assert_equal [0, 10, 20, 30], vertical.images.map(&:top) + assert_equal [0, 0, 0, 0], vertical.images.map(&:left) + end + + it "should have a vertical layout with spacing" do + base = sprite_map_test(@options.merge({"spacing" => Sass::Script::Number.new(10, ['px'])})) + assert_equal [0, 20, 40, 60], base.images.map(&:top) + end + + it "should layout vertical with position" do + base = sprite_map_test("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 10, 0, 0], base.images.map(&:left) + end + + it "should generate vertical sprites in decending order" do + sizes = vertical.images.map{|image| File.size(image.file) } + assert_equal sizes.min, File.size(vertical.images.first.file) + assert_equal sizes.max, File.size(vertical.images.last.file) + end + + # SMART LAYOUT + + it "should have a smart layout" do + base = smart + base.generate + assert_equal 400, base.width + assert_equal 60, base.height + assert_equal [[0, 0], [20, 120], [20, 0], [20, 100], [20, 160]], base.images.map {|i| [i.top, i.left]} + assert File.exists?(base.filename) + FileUtils.rm base.filename + end + + # DIAGONAL LAYOUT + + it "should generate a diagonal sprite" do + base = diagonal + base.generate + assert_equal 40, base.width + assert_equal 40, base.height + assert_equal [[30, 0], [20, 10], [10, 20], [0, 30]], base.images.map {|i| [i.top, i.left]} + assert File.exists?(base.filename) + FileUtils.rm base.filename + end + + # HORIZONTAL LAYOUT + + it "should have a horizontal layout" do + base = horizontal + assert_equal 10, base.height + assert_equal 40, base.width + end + + it "should layout images horizontaly" do + base = horizontal + assert_equal [0, 10, 20, 30], base.images.map(&:left) + assert_equal [0, 0, 0, 0], base.images.map(&:top) + end + + it "should layout horizontaly with spacing" do + base = horizontal("spacing" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 20, 40, 60], base.images.map(&:left) + assert_equal [0, 0, 0, 0], base.images.map(&:top) + assert_equal 80, base.width + end + + it "should layout horizontaly with position" do + base = horizontal("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 10, 0, 0], base.images.map(&:top) + end + + it "should generate a horrizontal sprite" do + base = horizontal + base.generate + assert File.exists?(base.filename) + FileUtils.rm base.filename + end + +end \ No newline at end of file diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 107e3371..6083cbed 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -80,102 +80,6 @@ class SpriteMapTest < Test::Unit::TestCase @base.generate assert !File.exists?(file), "Sprite file did not get removed" end - - it "should have a vertical layout" do - assert_equal [0, 10, 20, 30], @base.images.map(&:top) - assert_equal [0, 0, 0, 0], @base.images.map(&:left) - end - - it "should have a vertical layout with spacing" do - base = sprite_map_test(@options.merge({"spacing" => Sass::Script::Number.new(10, ['px'])})) - assert_equal [0, 20, 40, 60], base.images.map(&:top) - end - - it "should layout vertical with position" do - base = sprite_map_test("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) - assert_equal [0, 10, 0, 0], base.images.map(&:left) - end - - def smart - options = @options.merge("layout" => Sass::Script::String.new('smart')) - importer = Compass::SpriteImporter.new - uri = "image_row/*.png" - path, name = Compass::SpriteImporter.path_and_name(uri) - sprite_names = Compass::SpriteImporter.sprite_names(uri) - sass_engine = Compass::SpriteImporter.sass_engine(uri, name, importer, options) - map = Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map {|n| "image_row/#{n}.png"}, path, name, sass_engine, options) - map.options = {:compass => {:logger => Compass::NullLogger.new}} - map - end - - it "should have a smart layout" do - base = smart - base.generate - assert_equal 400, base.width - assert_equal 60, base.height - assert_equal [[0, 0], [20, 120], [20, 0], [20, 100], [20, 160]], base.images.map {|i| [i.top, i.left]} - assert File.exists?(base.filename) - FileUtils.rm base.filename - end - - def diagonal - opts = @options.merge("layout" => Sass::Script::String.new('diagonal')) - sprite_map_test(opts) - end - - it "should generate a diagonal sprite" do - base = diagonal - base.generate - assert_equal 40, base.width - assert_equal 40, base.height - assert_equal [[30, 0], [20, 10], [10, 20], [0, 30]], base.images.map {|i| [i.top, i.left]} - assert File.exists?(base.filename) - FileUtils.rm base.filename - end - - # Horizontal tests - def horizontal(options= {}) - opts = @options.merge("layout" => Sass::Script::String.new('horizontal')) - opts.merge!(options) - sprite_map_test(opts) - end - - it "should have a horizontal layout" do - base = horizontal - assert_equal 10, base.height - assert_equal 40, base.width - end - - it "should layout images horizontaly" do - base = horizontal - assert_equal [0, 10, 20, 30], base.images.map(&:left) - assert_equal [0, 0, 0, 0], base.images.map(&:top) - end - - it "should layout horizontaly with spacing" do - base = horizontal("spacing" => Sass::Script::Number.new(10, ['px'])) - assert_equal [0, 20, 40, 60], base.images.map(&:left) - assert_equal [0, 0, 0, 0], base.images.map(&:top) - assert_equal 80, base.width - end - - it "should layout horizontaly with position" do - base = horizontal("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) - assert_equal [0, 10, 0, 0], base.images.map(&:top) - end - - it "should generate a horrizontal sprite" do - base = horizontal - base.generate - assert File.exists?(base.filename) - FileUtils.rm base.filename - end - - it "should generate vertical sprites in decending order" do - sizes = @base.images.map{|image| File.size(image.file) } - assert_equal sizes.min, File.size(@base.images.first.file) - assert_equal sizes.max, File.size(@base.images.last.file) - end test "should get correct relative_name" do Compass.reset_configuration! From 104f3cbf44e62bafedb72b21634f2b37fb024df6 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 9 Dec 2011 21:26:43 -0500 Subject: [PATCH 186/290] moved test to correct spot --- test/units/sprites/image_test.rb | 20 -------------------- test/units/sprites/sprite_map_test.rb | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index 823fb0e6..d1b3b0e4 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -82,24 +82,4 @@ class SpritesImageTest < Test::Unit::TestCase assert_equal 0, img.offset end - - test 'gets name for sprite in search path' do - Compass.reset_configuration! - uri = 'foo/*.png' - other_folder = File.join(@images_tmp_path, '../other-temp') - FileUtils.mkdir_p other_folder - FileUtils.mkdir_p File.join(other_folder, 'foo') - %w(my bar).each do |file| - FileUtils.touch(File.join(other_folder, "foo/#{file}.png")) - end - config = Compass::Configuration::Data.new('config') - config.images_path = @images_tmp_path - config.sprite_load_path = [@images_tmp_path, other_folder] - Compass.add_configuration(config, "sprite_config") - image = Compass::SassExtensions::Sprites::Image.new(test_map, "foo/my.png", {}) - assert_equal File.join(other_folder, 'foo/my.png'), image.file - assert_equal 0, image.size - FileUtils.rm_rf other_folder - end - end diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 6083cbed..83a38bcc 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -109,5 +109,24 @@ class SpriteMapTest < Test::Unit::TestCase base = sprite_map_test(@options.merge('selectors_ten_by_ten_position' => percent)) assert_equal percent, base.image_for('ten-by-ten').position end + + test 'gets name for sprite in search path' do + Compass.reset_configuration! + uri = 'foo/*.png' + other_folder = File.join(@images_tmp_path, '../other-temp') + FileUtils.mkdir_p other_folder + FileUtils.mkdir_p File.join(other_folder, 'foo') + %w(my bar).each do |file| + FileUtils.touch(File.join(other_folder, "foo/#{file}.png")) + end + config = Compass::Configuration::Data.new('config') + config.images_path = @images_tmp_path + config.sprite_load_path = [@images_tmp_path, other_folder] + Compass.add_configuration(config, "sprite_config") + image = Compass::SassExtensions::Sprites::Image.new(@basegit status, "foo/my.png", {}) + assert_equal File.join(other_folder, 'foo/my.png'), image.file + assert_equal 0, image.size + FileUtils.rm_rf other_folder + end end \ No newline at end of file From f8377d15acd7acc560ac8f28f7f22358ab469b4a Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 00:55:16 -0500 Subject: [PATCH 187/290] refactoring and code cleanup --- Guardfile | 22 +++++++++------- lib/compass/sass_extensions/sprites.rb | 2 ++ .../sprites/engines/chunky_png_engine.rb | 2 +- lib/compass/sass_extensions/sprites/image.rb | 24 ++++++++++++++++-- .../sass_extensions/sprites/layout_methods.rb | 7 +++++ .../sass_extensions/sprites/sprite_map.rb | 9 ++++++- .../sass_extensions/sprites/sprite_methods.rb | 3 +-- .../sprites/public/images/repeat_x/five.png | Bin 0 -> 176 bytes .../sprites/public/images/repeat_x/four.xcf | Bin 0 -> 656 bytes .../sprites/public/images/repeat_x/one.png | Bin 0 -> 168 bytes .../sprites/public/images/repeat_x/three.png | Bin 0 -> 179 bytes .../sprites/public/images/repeat_x/two.png | Bin 0 -> 178 bytes test/integrations/sprites_test.rb | 4 +-- test/test_helper.rb | 2 +- test/units/sprites/image_test.rb | 22 +++++++++++++--- test/units/sprites/layout_test.rb | 21 ++++++++------- test/units/sprites/sprite_map_test.rb | 3 +-- 17 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 test/fixtures/sprites/public/images/repeat_x/five.png create mode 100644 test/fixtures/sprites/public/images/repeat_x/four.xcf create mode 100644 test/fixtures/sprites/public/images/repeat_x/one.png create mode 100644 test/fixtures/sprites/public/images/repeat_x/three.png create mode 100644 test/fixtures/sprites/public/images/repeat_x/two.png diff --git a/Guardfile b/Guardfile index 46405604..c1258d0c 100644 --- a/Guardfile +++ b/Guardfile @@ -1,12 +1,16 @@ -guard :test do - watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" } - watch(%r{^test/.+_test\.rb$}) - watch(%r{^test/units/.+_test\.rb$}) - watch('test/test_helper.rb') { "test" } +group :tests do + guard :test do + watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^test/.+_test\.rb$}) + watch(%r{^test/units/.+_test\.rb$}) + watch('test/test_helper.rb') { "test" } + end end -guard :cucumber do - watch(%r{^features/.+\.feature$}) - watch(%r{^features/support/.+$}) { 'features' } - watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' } +group :features do + guard :cucumber do + watch(%r{^features/.+\.feature$}) + watch(%r{^features/support/.+$}) { 'features' } + watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' } + end end \ No newline at end of file diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb index b5f08a94..5047c74a 100644 --- a/lib/compass/sass_extensions/sprites.rb +++ b/lib/compass/sass_extensions/sprites.rb @@ -2,11 +2,13 @@ require 'digest/md5' require 'compass/sprite_importer' module Compass + class SpriteException < Exception; end module SassExtensions module Sprites end end end + require 'compass/sass_extensions/sprites/image_row' require 'compass/sass_extensions/sprites/row_fitter' require 'compass/sass_extensions/sprites/image' diff --git a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb index 99bca823..0e51a82e 100644 --- a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +++ b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb @@ -13,7 +13,7 @@ module Compass @canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT) images.each do |image| input_png = ChunkyPNG::Image.from_file(image.file) - if image.repeat == "no-repeat" + if image.no_repeat? canvas.replace! input_png, image.left, image.top else x = image.left - (image.left / image.width).ceil * image.width diff --git a/lib/compass/sass_extensions/sprites/image.rb b/lib/compass/sass_extensions/sprites/image.rb index 9ea024e4..3bd7e0d6 100644 --- a/lib/compass/sass_extensions/sprites/image.rb +++ b/lib/compass/sass_extensions/sprites/image.rb @@ -6,6 +6,11 @@ module Compass TARGET = %r{[_-]target$} HOVER = %r{[_-]hover$} PARENT = %r{(.+)[-_](.+)$} + + REPEAT_X = 'repeat-x' + NO_REPEAT = 'no-repeat' + + VALID_REPEATS = [REPEAT_X, NO_REPEAT] attr_reader :relative_file, :options, :base attr_accessor :top, :left @@ -53,8 +58,23 @@ module Compass end # Value of $#{name}-repeat or $repeat - def repeat - @repeat ||= (get_var_file("repeat") || options.get_var("repeat") || Sass::Script::String.new("no-repeat")).value + def repeat + @repeat ||= begin + rep = (get_var_file("repeat") || options.get_var("repeat") || Sass::Script::String.new(NO_REPEAT)).value + unless VALID_REPEATS.include? rep + raise SpriteException, "Invalid option for repeat \"#{rep}\" - valid options are #{VALID_REPEATS.join(', ')}" + end + + rep + end + end + + def repeat_x? + repeat == REPEAT_X + end + + def no_repeat? + repeat == NO_REPEAT end # Value of $#{name}-position or $position defaults to 0px diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index e2384912..151f9ee1 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -5,6 +5,7 @@ module Compass HORIZONTAL = 'horizontal' DIAGONAL = 'diagonal' SMART = 'smart' + VERTICAL = 'vertical' def smart? layout == SMART @@ -17,6 +18,10 @@ module Compass def diagonal? layout == DIAGONAL end + + def vertical? + layout == VERTICAL + end def layout @layout ||= @kwargs.get_var('layout').value @@ -43,11 +48,13 @@ module Compass b.size <=> a.size end end + @width = width_for_vertical_layout calulate_vertical_postions @height = height_for_vertical_layout end end + def calculate_smart_positions fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images) diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb index 3ea296c1..8390faea 100644 --- a/lib/compass/sass_extensions/sprites/sprite_map.rb +++ b/lib/compass/sass_extensions/sprites/sprite_map.rb @@ -49,7 +49,14 @@ module Compass end def inspect - to_s + puts 'images' + @images.each do |img| + puts img.file + end + puts "options" + @kwargs.each do |k,v| + puts "#{k}:#{v}" + end end def to_s(kwargs = self.kwargs) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 70d85d23..1488ef40 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -27,8 +27,7 @@ module Compass # Creates the Sprite::Image objects for each image and calculates the width def init_images @images = image_names.collect do |relative_file| - image = Compass::SassExtensions::Sprites::Image.new(self, relative_file, kwargs) - image + Image.new(self, relative_file, kwargs) end end diff --git a/test/fixtures/sprites/public/images/repeat_x/five.png b/test/fixtures/sprites/public/images/repeat_x/five.png new file mode 100644 index 0000000000000000000000000000000000000000..4cac0a23c2920d9c43afe8071a1b753e26007e6e GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61SFYwH*Nw_jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfZ5}Qbc1@94Z{vVMN+qrlCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5xpPc?yXNzKO~0E6SaLszp3q978y+C;$2X-=0}0A<2Pt$tT8F-Y>Y!AF ziC*UUd7f=~tWB|jolu}mE*Zvo0P$Ny6yfg<(VKlSM!>j7P+^RC44mp7uzrbosBzg; zxT28O|vX)@B#7O|xA`&>fha+8hw ziPFO5u7spcX{lEnCeM>PI>AB**B%K!iX literal 0 HcmV?d00001 diff --git a/test/fixtures/sprites/public/images/repeat_x/one.png b/test/fixtures/sprites/public/images/repeat_x/one.png new file mode 100644 index 0000000000000000000000000000000000000000..e94b22e35fac126512dc13e6a468f352c0c42898 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2s6ii6yp7}lMWc?slj7I;J!Gca%q zgD@k*tT_@uLG}_)Usv|qJX|bnlG+h(HUou}N?apKobz*YQ}ap~oQqNuOHxx5$}>wc z6x=<10~GS}6cQDD6O-Fllsf}e^LV;AhHzX@{_+36Jp=1Mrhj+NL_P`sfZ5}QbcD{`hB20loN+qrlCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5xpPc?yXNzKO~0E6SaLs>MBB978y+C;$2X-<}x^gqe91A{atcn3?m6q&$I2 O7(8A5T-G@yGywp2uPQzO literal 0 HcmV?d00001 diff --git a/test/fixtures/sprites/public/images/repeat_x/two.png b/test/fixtures/sprites/public/images/repeat_x/two.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9575a0843ab9828a5276966fd956c5e49721be GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBL7~QRScvUi-X*q7}lMWc?slj7I;Jg1-XSm zn2}-D90{Nxdx@v7EBkF8E*3VkhR%zxfI> {:logger => Compass::NullLogger.new}} map end diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb index d1b3b0e4..bd3e44ab 100644 --- a/test/units/sprites/image_test.rb +++ b/test/units/sprites/image_test.rb @@ -4,10 +4,15 @@ require 'ostruct' class SpritesImageTest < Test::Unit::TestCase include SpriteHelper + def setup create_sprite_temp end + def teardown + clean_up_sprites + end + SPRITE_FILENAME = 'selectors/ten-by-ten.png' def sprite_path @@ -51,13 +56,22 @@ class SpritesImageTest < Test::Unit::TestCase assert_nil test_image.parent end - test 'image type is "global"' do - image = test_image "selectors_ten_by_ten_repeat" => Sass::Script::String.new('global') - assert_equal 'global', image.repeat + test 'image type is "global" should raise exception' do + assert_raise ::Compass::SpriteException do + image = test_image "selectors_ten_by_ten_repeat" => Sass::Script::String.new('global') + image.repeat + end end test 'image type is "no-repeat"' do - assert_equal 'no-repeat', test_image.repeat + img = test_image + assert_equal 'no-repeat', img.repeat + assert img.no_repeat? + end + + test 'image repeat-x' do + img = test_image "selectors_ten_by_ten_repeat" => Sass::Script::String.new('repeat-x') + assert img.repeat_x? end test 'image position' do diff --git a/test/units/sprites/layout_test.rb b/test/units/sprites/layout_test.rb index ba661216..e82617ce 100644 --- a/test/units/sprites/layout_test.rb +++ b/test/units/sprites/layout_test.rb @@ -50,23 +50,23 @@ class LayoutTest < Test::Unit::TestCase sprite_map_test(opts) end - # REPEAT-X - # VERTICAL LAYOUT it "should have a vertical layout" do - assert_equal [0, 10, 20, 30], vertical.images.map(&:top) - assert_equal [0, 0, 0, 0], vertical.images.map(&:left) + vert = vertical + assert_equal [0, 10, 20, 30], vert.images.map(&:top) + assert_equal [0, 0, 0, 0], vert.images.map(&:left) + assert vert.vertical? end it "should have a vertical layout with spacing" do - base = sprite_map_test(@options.merge({"spacing" => Sass::Script::Number.new(10, ['px'])})) - assert_equal [0, 20, 40, 60], base.images.map(&:top) + vert = sprite_map_test(@options.merge({"spacing" => Sass::Script::Number.new(10, ['px'])})) + assert_equal [0, 20, 40, 60], vert.images.map(&:top) end it "should layout vertical with position" do - base = sprite_map_test("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) - assert_equal [0, 10, 0, 0], base.images.map(&:left) + vert = sprite_map_test("selectors_ten_by_ten_active_position" => Sass::Script::Number.new(10, ['px'])) + assert_equal [0, 10, 0, 0], vert.images.map(&:left) end it "should generate vertical sprites in decending order" do @@ -80,6 +80,7 @@ class LayoutTest < Test::Unit::TestCase it "should have a smart layout" do base = smart base.generate + assert base.smart? assert_equal 400, base.width assert_equal 60, base.height assert_equal [[0, 0], [20, 120], [20, 0], [20, 100], [20, 160]], base.images.map {|i| [i.top, i.left]} @@ -92,6 +93,7 @@ class LayoutTest < Test::Unit::TestCase it "should generate a diagonal sprite" do base = diagonal base.generate + assert base.diagonal? assert_equal 40, base.width assert_equal 40, base.height assert_equal [[30, 0], [20, 10], [10, 20], [0, 30]], base.images.map {|i| [i.top, i.left]} @@ -103,6 +105,7 @@ class LayoutTest < Test::Unit::TestCase it "should have a horizontal layout" do base = horizontal + assert base.horizontal? assert_equal 10, base.height assert_equal 40, base.width end @@ -110,7 +113,7 @@ class LayoutTest < Test::Unit::TestCase it "should layout images horizontaly" do base = horizontal assert_equal [0, 10, 20, 30], base.images.map(&:left) - assert_equal [0, 0, 0, 0], base.images.map(&:top) + assert_equal [0, 0, 0, 0], base.images.map(&:top) end it "should layout horizontaly with spacing" do diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb index 83a38bcc..a59fd086 100644 --- a/test/units/sprites/sprite_map_test.rb +++ b/test/units/sprites/sprite_map_test.rb @@ -123,10 +123,9 @@ class SpriteMapTest < Test::Unit::TestCase config.images_path = @images_tmp_path config.sprite_load_path = [@images_tmp_path, other_folder] Compass.add_configuration(config, "sprite_config") - image = Compass::SassExtensions::Sprites::Image.new(@basegit status, "foo/my.png", {}) + image = Compass::SassExtensions::Sprites::Image.new(@base, "foo/my.png", {}) assert_equal File.join(other_folder, 'foo/my.png'), image.file assert_equal 0, image.size - FileUtils.rm_rf other_folder end end \ No newline at end of file From 6194cb478a59b5c60b01420ea1a17e88f66c2991 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 12:49:34 -0500 Subject: [PATCH 188/290] fixed repeat-x issues closes #633" --- .../sprites/engines/chunky_png_engine.rb | 14 +--------- .../sass_extensions/sprites/layout_methods.rb | 26 +++++++++++++++++- .../sprites/public/images/repeat_x/four.png | Bin 0 -> 2802 bytes .../sprites/public/images/repeat_x/four.xcf | Bin 656 -> 0 bytes test/integrations/sprites_test.rb | 4 +-- test/test_helper.rb | 11 ++++++-- test/units/actions_test.rb | 2 +- test/units/sprites/engine_test.rb | 7 ++++- test/units/sprites/image_row_test.rb | 1 + test/units/sprites/layout_test.rb | 16 +++++++++++ 10 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 test/fixtures/sprites/public/images/repeat_x/four.png delete mode 100644 test/fixtures/sprites/public/images/repeat_x/four.xcf diff --git a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb index 0e51a82e..19c210c7 100644 --- a/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb +++ b/lib/compass/sass_extensions/sprites/engines/chunky_png_engine.rb @@ -13,19 +13,7 @@ module Compass @canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT) images.each do |image| input_png = ChunkyPNG::Image.from_file(image.file) - if image.no_repeat? - canvas.replace! input_png, image.left, image.top - else - x = image.left - (image.left / image.width).ceil * image.width - while x < width do - begin - canvas.replace! input_png, x, image.top - x += image.width - rescue ChunkyPNG::OutOfBounds - break; - end - end - end + canvas.replace! input_png, image.left, image.top end end diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index 151f9ee1..dea34db0 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -52,9 +52,33 @@ module Compass @width = width_for_vertical_layout calulate_vertical_postions @height = height_for_vertical_layout + if @images.any?(&:repeat_x?) + calculate_repeat_extra_width! + tile_images_that_repeat + end end end + def tile_images_that_repeat + @images.map {|img| img if img.repeat_x?}.compact.each do |image| + x = image.left - (image.left / image.width).ceil * image.width + while x < @width do + begin + img = image.dup + img.top = image.top + img.left = x.to_i + @images << img + x += image.width + end + end + end + end + + def calculate_repeat_extra_width! + m = @images.inject(1) {|m,img| img.repeat_x? ? m.lcm(img.width) : m} + remainder = @width % m + @width += (m - remainder) unless remainder.zero? + end def calculate_smart_positions fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images) @@ -104,7 +128,7 @@ module Compass def calulate_vertical_postions @images.each_with_index do |image, index| - image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value + image.left = (image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value).to_i next if index == 0 last_image = @images[index-1] image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max diff --git a/test/fixtures/sprites/public/images/repeat_x/four.png b/test/fixtures/sprites/public/images/repeat_x/four.png new file mode 100644 index 0000000000000000000000000000000000000000..079a84e6d2f5f04d878c67a7e5f1b56394e9095d GIT binary patch literal 2802 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 Ef;9S100000 literal 0 HcmV?d00001 diff --git a/test/fixtures/sprites/public/images/repeat_x/four.xcf b/test/fixtures/sprites/public/images/repeat_x/four.xcf deleted file mode 100644 index cadc920f81b306a8fde216b99fd8f0ef4ea1d39d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 zcmZ`%OHRWu5Oo5A(oz+~XTxTe=_07TLRp|LD)kDkW4jiKT_vt)IRYzg!|}>Y>Y!AF ziC*UUd7f=~tWB|jolu}mE*Zvo0P$Ny6yfg<(VKlSM!>j7P+^RC44mp7uzrbosBzg; zxT28O|vX)@B#7O|xA`&>fha+8hw ziPFO5u7spcX{lEnCeM>PI>AB**B%K!iX diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 06964835..e1ef64a8 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -380,7 +380,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s13833277b3.png') no-repeat; + background: url('/squares-s65c43cd573.png') no-repeat; } .squares-ten-by-ten { @@ -628,7 +628,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .ko-sprite, .ko-default_background, .ko-starbg26x27 { - background: url('/ko-sd6b4d44430.png') no-repeat; + background: url('/ko-sd46dfbab4f.png') no-repeat; } .ko-default_background { diff --git a/test/test_helper.rb b/test/test_helper.rb index 3b904712..cb8ce6d3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -23,6 +23,12 @@ require 'compass' require 'test/unit' +class String + def name + to_s + end +end + %w(command_line diff io rails test_case).each do |helper| require "helpers/#{helper}" end @@ -60,8 +66,9 @@ module SpriteHelper end def clean_up_sprites - init_sprite_helper - ::FileUtils.rm_r @images_tmp_path + init_sprite_helper + ::FileUtils.rm_r @images_tmp_path + rescue Errno::ENOENT => e end end \ No newline at end of file diff --git a/test/units/actions_test.rb b/test/units/actions_test.rb index 21b26414..c1cb379b 100644 --- a/test/units/actions_test.rb +++ b/test/units/actions_test.rb @@ -13,7 +13,7 @@ class ActionsTest < Test::Unit::TestCase end # When log4r is included, it sometimes breaks the Actions - def test_quiet_option + test "test_quiet_option" do b = BaseActionExtender.new b.logger = "" b.options[:quiet] = true diff --git a/test/units/sprites/engine_test.rb b/test/units/sprites/engine_test.rb index a172c518..571c1fac 100644 --- a/test/units/sprites/engine_test.rb +++ b/test/units/sprites/engine_test.rb @@ -1,14 +1,19 @@ require 'test_helper' class EngineTest < Test::Unit::TestCase - + include SpriteHelper def setup + create_sprite_temp sprite_filename = 'squares/ten-by-ten.png' @images = [ Compass::SassExtensions::Sprites::Image.new(nil, File.join(sprite_filename), {}) ] @engine = Compass::SassExtensions::Sprites::Engine.new(100, 100, @images) end + + def taredown + clean_up_sprites + end test "should have width of 100" do diff --git a/test/units/sprites/image_row_test.rb b/test/units/sprites/image_row_test.rb index 4c92b88a..6f40c819 100644 --- a/test/units/sprites/image_row_test.rb +++ b/test/units/sprites/image_row_test.rb @@ -3,6 +3,7 @@ require 'test_helper' class ImageRowTest < Test::Unit::TestCase include SpriteHelper def setup + clean_up_sprites create_sprite_temp file = StringIO.new("images_path = #{@images_src_path.inspect}\n") Compass.add_configuration(file, "sprite_config") diff --git a/test/units/sprites/layout_test.rb b/test/units/sprites/layout_test.rb index e82617ce..9c85f4c3 100644 --- a/test/units/sprites/layout_test.rb +++ b/test/units/sprites/layout_test.rb @@ -5,6 +5,7 @@ class LayoutTest < Test::Unit::TestCase def setup Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader) + clean_up_sprites create_sprite_temp file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n") Compass.add_configuration(file, "sprite_config") @@ -50,6 +51,21 @@ class LayoutTest < Test::Unit::TestCase sprite_map_test(opts) end + # REPEAT_X + + test 'repeat-x layout single image' do + opts = {"repeat_x_three_repeat" => Sass::Script::String.new('repeat-x')} + map = sprite_map_test(@options.merge(opts), 'repeat_x/*.png') + assert_equal 6, map.width + assert_equal [0, 4, 7, 9, 14, 4, 4], map.images.map(&:top) + end + + test 'repeat-x layout multi image' do + opts = {"repeat_x_three_repeat" => Sass::Script::String.new('repeat-x'), "repeat_x_four_repeat" => Sass::Script::String.new('repeat-x')} + map = sprite_map_test(@options.merge(opts), 'repeat_x/*.png') + assert_equal 12, map.width + end + # VERTICAL LAYOUT it "should have a vertical layout" do From 26249208a052b62799d9d10167ed9344c3b63f4b Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 12:52:47 -0500 Subject: [PATCH 189/290] forgot to test left position --- test/units/sprites/layout_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/units/sprites/layout_test.rb b/test/units/sprites/layout_test.rb index 9c85f4c3..371e3eb3 100644 --- a/test/units/sprites/layout_test.rb +++ b/test/units/sprites/layout_test.rb @@ -58,6 +58,7 @@ class LayoutTest < Test::Unit::TestCase map = sprite_map_test(@options.merge(opts), 'repeat_x/*.png') assert_equal 6, map.width assert_equal [0, 4, 7, 9, 14, 4, 4], map.images.map(&:top) + assert_equal [0, 0, 0, 0, 0, 0, 3], map.images.map(&:left) end test 'repeat-x layout multi image' do From 3fc9dc79dc5ff40f1a781d558ff386267ec1bf10 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 12:54:39 -0500 Subject: [PATCH 190/290] added 1.9.3 to travis ci --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index a388edde..0d7fa848 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ rvm: - 1.8.7 - 1.9.2 + - 1.9.3 - jruby - rbx - ree From 073c04cde8f9575d3027bbfd0b66480a123f63ff Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 12:55:54 -0500 Subject: [PATCH 191/290] 1.8.7 fix --- lib/compass/sass_extensions/sprites/layout_methods.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb index dea34db0..b2728056 100644 --- a/lib/compass/sass_extensions/sprites/layout_methods.rb +++ b/lib/compass/sass_extensions/sprites/layout_methods.rb @@ -75,6 +75,7 @@ module Compass end def calculate_repeat_extra_width! + require 'rational' #for ruby 1.8.7 m = @images.inject(1) {|m,img| img.repeat_x? ? m.lcm(img.width) : m} remainder = @width % m @width += (m - remainder) unless remainder.zero? From 5bf3b68d2c4721c2ffbca8c21289d0a250344b22 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 13:07:21 -0500 Subject: [PATCH 192/290] tuned Gemfile for travis-ci --- Gemfile | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index d85d3276..649961aa 100644 --- a/Gemfile +++ b/Gemfile @@ -9,26 +9,25 @@ gem "compass-validator", "3.0.1" gem "css_parser", "~> 1.0.1" gem "sass", "~> 3.1" gem "haml", "~> 3.1" -gem "rcov", :platform => :mri_18 gem "rubyzip" gem "livereload" -gem "ruby-prof", :platform => :mri_18 - gem 'mocha' gem 'timecop' -gem 'guard' -gem 'guard-test' -gem 'guard-cucumber' gem 'diff-lcs', '~> 1.1.2' gem 'rake', '~> 0.9.2' -#Warning becarful adding OS dependant gems to this file it will cause issues on the CI server - +# Warning becarful adding OS dependant gems above this line it will break the CI server please +# place them below so they are excluded unless ENV["CI"] gem 'rb-fsevent' gem 'growl_notify' + gem "ruby-prof", :platform => :mri_18 + gem "rcov", :platform => :mri_18 + gem 'guard' + gem 'guard-test' + gem 'guard-cucumber' end From 684ad8754a9d73fe7f06967d0623b785bda132d1 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 10 Dec 2011 15:10:30 -0500 Subject: [PATCH 193/290] compass will now detect if your in a rails app and attempt to load its configuration from the application.rb if you are not using a compass configuration file --- lib/compass/configuration/helpers.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index b1bd8907..b616797b 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -95,6 +95,16 @@ module Compass def add_project_configuration(*args) options = args.last.is_a?(Hash) ? args.pop : {} configuration_file_path = args.shift || detect_configuration_file + + # TODO make this better i don't think it belongs here but it gets the job done + # This will allow compass to boot rails and load the config if its configured in the application.rb file via railtie + if File.exists?(projectize('config/boot.rb')) && configuration_file_path.nil? + require 'rails' + require projectize('config/application.rb') + options[:project_type] = :rails + end + + raise ArgumentError, "Too many arguments" if args.any? if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults])) if data.raw_project_type From 89de5cb492402bd8e8b93361ee1762dbaabde0fe Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 11 Dec 2011 01:31:54 -0500 Subject: [PATCH 194/290] fixed some issues with test runners calling out the the command line which was creating unexpected results --- Gemfile | 4 ++-- features/extensions.feature | 2 +- features/step_definitions/command_line_steps.rb | 7 ++++--- test/helpers/rails.rb | 13 +++++++++++-- test/units/sprites/sprite_command_test.rb | 8 ++++++-- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 649961aa..6f5eb63b 100644 --- a/Gemfile +++ b/Gemfile @@ -2,9 +2,9 @@ source :rubygems gemspec -gem "cucumber", "~> 1.1.0" +gem "cucumber", "~> 1.1.4" gem "rspec", "~>2.0.0" -gem "rails", "~>3.0.0.rc" +gem "rails", "~> 3.1" gem "compass-validator", "3.0.1" gem "css_parser", "~> 1.0.1" gem "sass", "~> 3.1" diff --git a/features/extensions.feature b/features/extensions.feature index 1f1a979c..a4f15803 100644 --- a/features/extensions.feature +++ b/features/extensions.feature @@ -15,7 +15,7 @@ Feature: Extensions @listframeworks Scenario: Extensions directory for rails projects Given ruby supports fork - And I'm in a newly created rails project: my_rails_project + And I'm in a newly created rails project: extension_test_rails_project And I run: compass init rails And the "vendor/plugins/compass_extensions" directory exists And and I have a fake extension at vendor/plugins/compass_extensions/testing diff --git a/features/step_definitions/command_line_steps.rb b/features/step_definitions/command_line_steps.rb index 8a0eb25b..534bbcec 100644 --- a/features/step_definitions/command_line_steps.rb +++ b/features/step_definitions/command_line_steps.rb @@ -42,10 +42,11 @@ Given %r{^I am in the parent directory$} do end Given %r{^I'm in a newly created rails project: (.+)$} do |project_name| - @cleanup_directories << project_name + dir = File.join(Dir.pwd, project_name) + @cleanup_directories << dir begin - generate_rails_app project_name - Dir.chdir project_name + generate_rails_app project_name, Dir.pwd + Dir.chdir dir rescue LoadError pending "Missing Ruby-on-rails gems: sudo gem install rails" end diff --git a/test/helpers/rails.rb b/test/helpers/rails.rb index 12c60c0f..614322a8 100644 --- a/test/helpers/rails.rb +++ b/test/helpers/rails.rb @@ -10,7 +10,7 @@ module Compass # Generate a rails application without polluting our current set of requires # with the rails libraries. This will allow testing against multiple versions of rails # by manipulating the load path. - def generate_rails_app(name) + def generate_rails_app(name, dir = nil) if pid = fork Process.wait(pid) if $?.exitstatus == 2 @@ -22,7 +22,16 @@ module Compass begin require 'action_pack/version' if ActionPack::VERSION::MAJOR >= 3 - `rails new #{name}` + require 'rails/generators' + require 'rails/generators/rails/app/app_generator' + require 'mocha' + dir ||= File.join(File.expand_path('../../', __FILE__)) + args = [File.join(dir, name), '-q', '-f', '--skip-bundle', '--skip-gemfile'] + + #stub this so you can generate more apps + Rails::Generators::AppGenerator.any_instance.stubs(:valid_const?).returns(true) + Rails::Generators::AppGenerator.start(args, {:destination_root => dir}) + else require 'rails/version' require 'rails_generator' diff --git a/test/units/sprites/sprite_command_test.rb b/test/units/sprites/sprite_command_test.rb index 4e4354fb..b1242b66 100644 --- a/test/units/sprites/sprite_command_test.rb +++ b/test/units/sprites/sprite_command_test.rb @@ -1,6 +1,10 @@ require 'test_helper' - +require 'compass/exec' class SpriteCommandTest < Test::Unit::TestCase + include Compass::TestCaseHelper + include Compass::CommandLineHelper + include Compass::IoHelper + attr_reader :test_dir include SpriteHelper def setup @@ -27,7 +31,7 @@ class SpriteCommandTest < Test::Unit::TestCase def run_compass_with_options(options) output = 'foo' ::Dir.chdir @test_dir - %x{compass #{options.join(' ')}} + compass *options end def options_to_cli(options) From 7d22d3668c30eb920c559888c37a922a227cc06a Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 11 Dec 2011 01:38:11 -0500 Subject: [PATCH 195/290] detecting rails was breaking features on traivis ci will investigate --- lib/compass/configuration/helpers.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index b616797b..b6396bc1 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -98,11 +98,11 @@ module Compass # TODO make this better i don't think it belongs here but it gets the job done # This will allow compass to boot rails and load the config if its configured in the application.rb file via railtie - if File.exists?(projectize('config/boot.rb')) && configuration_file_path.nil? - require 'rails' - require projectize('config/application.rb') - options[:project_type] = :rails - end + # if File.exists?(projectize('config/boot.rb')) && configuration_file_path.nil? + # require 'rails' + # require projectize('config/application.rb') + # options[:project_type] = :rails + # end raise ArgumentError, "Too many arguments" if args.any? From 03f648d5c44197088e4cbeaa0c7f8df10ba4b8ae Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 13 Dec 2011 18:14:20 -0500 Subject: [PATCH 196/290] bump sprite version for next release --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index 1488ef40..a5ce3c12 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -5,7 +5,7 @@ module Compass # Changing this string will invalidate all previously generated sprite images. # We should do so only when the packing algorithm changes - SPRITE_VERSION = "2" + SPRITE_VERSION = "3" # Calculates the overal image dimensions # collects image sizes and input parameters for each sprite From 57dcbad3aea28894c9e43bcc8eff025844d8d808 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 13 Dec 2011 18:17:24 -0500 Subject: [PATCH 197/290] Revert "bump sprite version for next release" This reverts commit 03f648d5c44197088e4cbeaa0c7f8df10ba4b8ae. --- lib/compass/sass_extensions/sprites/sprite_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb index fa7882f0..7cfae1dd 100644 --- a/lib/compass/sass_extensions/sprites/sprite_methods.rb +++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb @@ -5,7 +5,7 @@ module Compass # Changing this string will invalidate all previously generated sprite images. # We should do so only when the packing algorithm changes - SPRITE_VERSION = "3" + SPRITE_VERSION = "2" # Calculates the overal image dimensions # collects image sizes and input parameters for each sprite From fdfca46d28e5f8340cbc5acc5ddc650ff0788545 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 17 Dec 2011 17:32:13 -0800 Subject: [PATCH 198/290] Allow the vertical rhythm to adjust to half lines when -to-nearest-half-line is set to true in order to avoid awkwardly large gaps between lines. This setting is false by default. --- doc-src/content/CHANGELOG.markdown | 8 ++++++++ .../compass/typography/_vertical_rhythm.scss | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 03fa99d7..f56a7bf8 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,6 +14,14 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.alpha.3 (UNRELEASED) +------------------------- + +* The `$round-to-nearest-half-line` config variable was added. When + true, the vertical rhythm module will round line heights to the + nearest half-line to avoid awkwardly large gaps between lines of text. + Defaults to false. + 0.12.alpha.2 (11/28/2011) ------------------------- diff --git a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss index 7fce4e37..31b29fb2 100644 --- a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +++ b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss @@ -15,6 +15,11 @@ $ie-font-ratio: 16px / 100%; // Set to false if you want to use absolute pixes in sizing your typography. $relative-font-sizing: true !default; +// Allows the `adjust-font-size-to` mixin and the `lines-for-font-size` function +// to round the line height to the nearest half line height instead of the +// nearest integral line height to avoid large spacing between lines. +$round-to-nearest-half-line: false !default; + // Ensure there is at least this many pixels // of vertical padding above and below the text. $min-line-padding: 2px; @@ -103,9 +108,11 @@ $base-half-leader: $base-leader / 2; } @function lines-for-font-size($font-size) { - $lines: ceil($font-size / $base-line-height); + $lines: if($round-to-nearest-half-line, + ceil(2 * $font-size / $base-line-height) / 2, + ceil($font-size / $base-line-height)); @if $lines * $base-line-height - $font-size < $min-line-padding * 2 { - $lines: $lines + 1; + $lines: $lines + if($round-to-nearest-half-line, 0.5, 1); } @return $lines; } From c92766ba99d7f2c6f00f666c804cbc8e6de309f2 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 19 Dec 2011 12:44:35 -0500 Subject: [PATCH 199/290] added reset-baseline to vertical rhythym --- .../stylesheets/compass/typography/_vertical_rhythm.scss | 5 +++++ test/fixtures/stylesheets/compass/css/vertical_rhythm.css | 3 +++ test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss index 7fce4e37..697911cd 100644 --- a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +++ b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss @@ -59,6 +59,11 @@ $base-half-leader: $base-leader / 2; } } +// resets the baseline to 1 leading unit +@mixin reset-baseline { + @include adjust-leading-to(1, if($relative-font-sizing, $base-font-size, $base-font-size)); +} + // Show a background image that can be used to debug your alignments. // include the $img argument if you would rather use your own image than the // Compass default gradient image. diff --git a/test/fixtures/stylesheets/compass/css/vertical_rhythm.css b/test/fixtures/stylesheets/compass/css/vertical_rhythm.css index ddf7c2ec..96032f49 100644 --- a/test/fixtures/stylesheets/compass/css/vertical_rhythm.css +++ b/test/fixtures/stylesheets/compass/css/vertical_rhythm.css @@ -40,3 +40,6 @@ html > body { border-bottom-style: solid; border-bottom-width: 0.25em; padding-bottom: 0.417em; } + +.reset { + line-height: 1.143em; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss b/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss index 09b6b224..1f00db41 100644 --- a/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss +++ b/test/fixtures/stylesheets/compass/sass/vertical_rhythm.scss @@ -11,4 +11,6 @@ $base-line-height: 16px; .small-padded { @include adjust-font-size-to(12px,1); @include rhythm(1,1,1,1,12px); } .borders { @include h-borders(1px,1); } -.large-borders { @include adjust-font-size-to(24px,3); @include h-borders(6px,1,24px); } \ No newline at end of file +.large-borders { @include adjust-font-size-to(24px,3); @include h-borders(6px,1,24px); } + +.reset { @include reset-baseline; } \ No newline at end of file From 986714a013592c4d274a6f3515e954f405b63e7d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 19 Dec 2011 12:47:15 -0500 Subject: [PATCH 200/290] changelog --- doc-src/content/CHANGELOG.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index f56a7bf8..5ea39920 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -22,6 +22,8 @@ The Documentation for the [latest preview release](http://beta.compass-style.org nearest half-line to avoid awkwardly large gaps between lines of text. Defaults to false. +* Added `reset-baseline` to the vertical rhythm module so you can force the baseline to reset. + 0.12.alpha.2 (11/28/2011) ------------------------- From b263bfdcaf91da235c608709009eb7766b2e666d Mon Sep 17 00:00:00 2001 From: tka Date: Tue, 20 Dec 2011 00:18:44 +0800 Subject: [PATCH 201/290] if manifest_file not exists, discover :all --- lib/compass/installers/manifest.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/compass/installers/manifest.rb b/lib/compass/installers/manifest.rb index b5faf022..848b5a5d 100644 --- a/lib/compass/installers/manifest.rb +++ b/lib/compass/installers/manifest.rb @@ -141,11 +141,16 @@ module Compass # evaluated in a Manifest instance context def parse(manifest_file) with_manifest(manifest_file) do - open(manifest_file) do |f| - eval(f.read, instance_binding, manifest_file) - end - end - end + if File.exists?(manifest_file) + open(manifest_file) do |f| + eval(f.read, instance_binding, manifest_file) + end + else + eval("discover :all", instance_binding, manifest_file) + end + end + end + def instance_binding binding From bac8667fb4d0103b975dacc261ed1da08f455e49 Mon Sep 17 00:00:00 2001 From: tka Date: Tue, 20 Dec 2011 00:48:20 +0800 Subject: [PATCH 202/290] update docs for missing manifest file --- doc-src/content/help/tutorials/extensions.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc-src/content/help/tutorials/extensions.markdown b/doc-src/content/help/tutorials/extensions.markdown index 99e6d24d..11d24a66 100644 --- a/doc-src/content/help/tutorials/extensions.markdown +++ b/doc-src/content/help/tutorials/extensions.markdown @@ -174,10 +174,13 @@ You may also see some real manifest files here: ### Manifest Declarations + **Easy Mode:** If you just have some basic files and nothing fancy going on, simply place this line in your manifest: discover :all +If the file is missing `discover :all` is the default + This will cause compass to find all the files in your template and use the files' extension to determine where they should go. Alternatively, you can request that compass only discover files of a certain type. For example, the following will only discover javascript and image assets, you could then declare other file types on your own. discover :javascripts From 829d44f581880637345328987b6d810b6c08adfa Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 20 Dec 2011 21:54:07 -0500 Subject: [PATCH 203/290] removed rails integration files --- lib/compass/app_integration/rails.rb | 83 -------- .../app_integration/rails/actionpack2x.rb | 10 - .../rails/actionpack2x/action_controller.rb | 15 -- .../rails/actionpack2x/sass_plugin.rb | 5 - .../rails/actionpack2x/urls.rb | 18 -- .../app_integration/rails/actionpack30.rb | 11 -- .../rails/actionpack30/railtie.rb | 46 ----- .../app_integration/rails/actionpack31.rb | 5 - .../rails/actionpack31/helpers.rb | 28 --- .../rails/actionpack31/railtie.rb | 87 --------- .../rails/configuration_defaults.rb | 123 ------------ .../app_integration/rails/installer.rb | 182 ------------------ lib/compass/app_integration/rails/runtime.rb | 17 -- .../rails/templates/compass-install-rails.rb | 78 -------- 14 files changed, 708 deletions(-) delete mode 100644 lib/compass/app_integration/rails.rb delete mode 100644 lib/compass/app_integration/rails/actionpack2x.rb delete mode 100644 lib/compass/app_integration/rails/actionpack2x/action_controller.rb delete mode 100644 lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb delete mode 100644 lib/compass/app_integration/rails/actionpack2x/urls.rb delete mode 100644 lib/compass/app_integration/rails/actionpack30.rb delete mode 100644 lib/compass/app_integration/rails/actionpack30/railtie.rb delete mode 100644 lib/compass/app_integration/rails/actionpack31.rb delete mode 100644 lib/compass/app_integration/rails/actionpack31/helpers.rb delete mode 100644 lib/compass/app_integration/rails/actionpack31/railtie.rb delete mode 100644 lib/compass/app_integration/rails/configuration_defaults.rb delete mode 100644 lib/compass/app_integration/rails/installer.rb delete mode 100644 lib/compass/app_integration/rails/runtime.rb delete mode 100644 lib/compass/app_integration/rails/templates/compass-install-rails.rb diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb deleted file mode 100644 index aaae4d42..00000000 --- a/lib/compass/app_integration/rails.rb +++ /dev/null @@ -1,83 +0,0 @@ -%w(configuration_defaults installer).each do |lib| - require "compass/app_integration/rails/#{lib}" -end - -require 'compass/app_integration/rails/runtime' if defined?(ActionController::Base) - - -module Compass - module AppIntegration - module Rails - - extend self - - def booted! - Compass::AppIntegration::Rails.const_set(:BOOTED, true) - end - - def booted? - defined?(Compass::AppIntegration::Rails::BOOTED) && Compass::AppIntegration::Rails::BOOTED - end - - def installer(*args) - Installer.new(*args) - end - - def configuration - config = Compass::Configuration::Data.new('rails') - config.extend(ConfigurationDefaults) - config.extend(ConfigurationDefaultsWithAssetPipeline) if Sass::Util.ap_geq?('3.1.0') || Sass::Util.ap_geq?('3.1.0.rc') || Sass::Util.ap_geq?('3.1.0.beta') - config - end - - def env - env_production? ? :production : :development - end - - def env_production? - if defined?(::Rails) && ::Rails.respond_to?(:env) - ::Rails.env.production? - elsif defined?(RAILS_ENV) - RAILS_ENV == "production" - end - end - - def root - if defined?(::Rails) && ::Rails.respond_to?(:root) - ::Rails.root - elsif defined?(RAILS_ROOT) - RAILS_ROOT - end - end - - def check_for_double_boot! - if booted? - Compass::Util.compass_warn("Warning: Compass was booted twice. Compass has a Railtie now; please remove your initializer.") - else - booted! - end - end - - def sass_plugin_enabled? - unless Sass::Util.ap_geq?('3.1.0.beta') - defined?(Sass::Plugin) && !Sass::Plugin.options[:never_update] - end - end - - def rails_compilation_enabled? - Sass::Util.ap_geq?('3.1.0.beta') && defined?(Sass::Rails) # XXX check if there's some other way(s) to disable the asset pipeline. - end - - # Rails 2.x projects use this in their compass initializer. - def initialize!(config = nil) - check_for_double_boot! - config ||= Compass.detect_configuration_file(root) - Compass.add_project_configuration(config, :project_type => :rails) - Compass.discover_extensions! - Compass.configure_sass_plugin! - Compass.handle_configuration_change! if sass_plugin_enabled? || rails_compilation_enabled? - end - end - end -end - diff --git a/lib/compass/app_integration/rails/actionpack2x.rb b/lib/compass/app_integration/rails/actionpack2x.rb deleted file mode 100644 index f48299bb..00000000 --- a/lib/compass/app_integration/rails/actionpack2x.rb +++ /dev/null @@ -1,10 +0,0 @@ -%w(action_controller sass_plugin urls).each do |lib| - require "compass/app_integration/rails/actionpack2x/#{lib}" -end - -# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? -class Sass::Script::Functions::EvaluationContext - include Sass::Script::Functions - private - include ActionView::Helpers::AssetTagHelper -end diff --git a/lib/compass/app_integration/rails/actionpack2x/action_controller.rb b/lib/compass/app_integration/rails/actionpack2x/action_controller.rb deleted file mode 100644 index d3a4b9e9..00000000 --- a/lib/compass/app_integration/rails/actionpack2x/action_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -# :stopdoc: -module ActionController - class Base - def process_with_compass(*args) - Sass::Plugin.rails_controller = self - begin - process_without_compass(*args) - ensure - Sass::Plugin.rails_controller = nil - end - end - alias_method_chain :process, :compass - end -end -# :startdoc: \ No newline at end of file diff --git a/lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb b/lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb deleted file mode 100644 index 8e0cba78..00000000 --- a/lib/compass/app_integration/rails/actionpack2x/sass_plugin.rb +++ /dev/null @@ -1,5 +0,0 @@ -module Sass::Plugin - class << self - attr_accessor :rails_controller - end -end \ No newline at end of file diff --git a/lib/compass/app_integration/rails/actionpack2x/urls.rb b/lib/compass/app_integration/rails/actionpack2x/urls.rb deleted file mode 100644 index ae96d774..00000000 --- a/lib/compass/app_integration/rails/actionpack2x/urls.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Compass::SassExtensions::Functions::Urls::ImageUrl - def image_url_with_rails_integration(path, only_path = Sass::Script::Bool.new(false), cache_buster = Sass::Script::Bool.new(true)) - if (@controller = Sass::Plugin.rails_controller) && @controller.respond_to?(:request) && @controller.request - begin - if only_path.to_bool - Sass::Script::String.new image_path(path.value) - else - Sass::Script::String.new "url(#{image_path(path.value)})" - end - ensure - @controller = nil - end - else - image_url_without_rails_integration(path, only_path, cache_buster) - end - end - alias_method_chain :image_url, :rails_integration -end diff --git a/lib/compass/app_integration/rails/actionpack30.rb b/lib/compass/app_integration/rails/actionpack30.rb deleted file mode 100644 index 05e24df8..00000000 --- a/lib/compass/app_integration/rails/actionpack30.rb +++ /dev/null @@ -1,11 +0,0 @@ -# TODO figure something out so image_path works with rails integration -%w(railtie).each do |lib| - require "compass/app_integration/rails/actionpack30/#{lib}" -end - -# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? -class Sass::Script::Functions::EvaluationContext - include Sass::Script::Functions - private - include ActionView::Helpers::AssetTagHelper -end diff --git a/lib/compass/app_integration/rails/actionpack30/railtie.rb b/lib/compass/app_integration/rails/actionpack30/railtie.rb deleted file mode 100644 index a3fc5498..00000000 --- a/lib/compass/app_integration/rails/actionpack30/railtie.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'compass' -require 'rails' - -class Rails::Railtie::Configuration - # Adds compass configuration accessor to the application configuration. - # - # If a configuration file for compass exists, it will be read in and - # the project's configuration values will already be set on the config - # object. - # - # For example: - # - # module MyApp - # class Application < Rails::Application - # config.compass.line_comments = !Rails.env.production? - # config.compass.fonts_dir = "app/assets/fonts" - # end - # end - # - # It is suggested that you create a compass configuration file if you - # want a quicker boot time when using the compass command line tool. - # - # For more information on available configuration options see: - # http://compass-style.org/help/tutorials/configuration-reference/ - def compass - @compass ||= begin - data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file)) - config_data - else - Compass::Configuration::Data.new("project") - end - data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded. - data - end - end -end - -module Compass - class Railtie < Rails::Railtie - initializer "compass.initialize_rails" do |app| - # Configure compass for use within rails, and provide the project configuration - # that came via the rails boot process. - Compass::AppIntegration::Rails.initialize!(app.config.compass) - end - end -end \ No newline at end of file diff --git a/lib/compass/app_integration/rails/actionpack31.rb b/lib/compass/app_integration/rails/actionpack31.rb deleted file mode 100644 index 5b894735..00000000 --- a/lib/compass/app_integration/rails/actionpack31.rb +++ /dev/null @@ -1,5 +0,0 @@ -# TODO figure something out so image_path works with rails integration -%w(railtie helpers).each do |lib| - require "compass/app_integration/rails/actionpack31/#{lib}" -end - diff --git a/lib/compass/app_integration/rails/actionpack31/helpers.rb b/lib/compass/app_integration/rails/actionpack31/helpers.rb deleted file mode 100644 index f37acdf8..00000000 --- a/lib/compass/app_integration/rails/actionpack31/helpers.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Sass::Script::Functions - def generated_image_url(path, only_path = nil) - asset_url(path, Sass::Script::String.new("image")) - end -end - - -module Compass::RailsImageFunctionPatch - private - - def image_path_for_size(image_file) - begin - file = ::Rails.application.assets.find_asset(image_file) - return file - rescue ::Sprockets::FileOutsidePaths - return super(image_file) - end - end -end - -module Sass::Script::Functions - include Compass::RailsImageFunctionPatch -end - -# Wierd that this has to be re-included to pick up sub-modules. Ruby bug? -class Sass::Script::Functions::EvaluationContext - include Sass::Script::Functions -end \ No newline at end of file diff --git a/lib/compass/app_integration/rails/actionpack31/railtie.rb b/lib/compass/app_integration/rails/actionpack31/railtie.rb deleted file mode 100644 index 08ae8572..00000000 --- a/lib/compass/app_integration/rails/actionpack31/railtie.rb +++ /dev/null @@ -1,87 +0,0 @@ -require 'compass' -require 'rails' - -class Rails::Railtie::Configuration - # Adds compass configuration accessor to the application configuration. - # - # If a configuration file for compass exists, it will be read in and - # the project's configuration values will already be set on the config - # object. - # - # For example: - # - # module MyApp - # class Application < Rails::Application - # config.compass.line_comments = !Rails.env.production? - # config.compass.fonts_dir = "app/assets/fonts" - # end - # end - # - # It is suggested that you create a compass configuration file if you - # want a quicker boot time when using the compass command line tool. - # - # For more information on available configuration options see: - # http://compass-style.org/help/tutorials/configuration-reference/ - def compass - @compass ||= begin - data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file)) - config_data - else - Compass::Configuration::Data.new("rails_config") - end - data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded. - Compass.add_project_configuration(data) - Compass.configuration.on_sprite_saved do |filename| - # This is a huge hack based on reading through the sprockets internals. - # Sprockets needs an API for adding assets during precompilation. - # At a minimum sprockets should provide this API: - # - # #filename is a path in the asset source directory - # Rails.application.assets.new_asset!(filename) - # - # # logical_path is how devs refer to it, data is the contents of it. - # Rails.application.assets.new_asset!(logical_path, data) - # - # I would also like to select one of the above calls based on whether - # the user is precompiling or not: - # - # Rails.application.assets.precompiling? #=> true or false - # - # But even the above is not an ideal API. The issue is that compass sprites need to - # avoid generation if the sprite file is already generated (which can be quite time - # consuming). To do this, compass has it's own uniqueness hash based on the user's - # inputs instead of being based on the file contents. So if we could provide our own - # hash or some metadata that is opaque to sprockets that could be read from the - # asset's attributes, we could avoid cluttering the assets directory with generated - # sprites and always just use the logical_path + data version of the api. - if Rails.application.config.assets.digests.try(:any?) - asset = Rails.application.assets.find_asset(filename) - pathname = Pathname.new(filename) - logical_path = filename[(Compass.configuration.generated_images_path.length+1)..-1] - # Force the asset into the cache so find_asset will find it. - cached_assets = Rails.application.assets.instance_variable_get("@assets") - cached_assets[logical_path] = cached_assets[filename] = asset - - target = Pathname.new(File.join(Rails.public_path, Rails.application.config.assets.prefix)) - asset = Rails.application.assets.find_asset(logical_path) - filename = target.join(asset.digest_path) - asset.write_to(filename) - end - end - data - end - @compass - end -end - -module Compass - class Railtie < Rails::Railtie - initializer "compass.initialize_rails", :group => :all do |app| - # Configure compass for use within rails, and provide the project configuration - # that came via the rails boot process. - Compass::AppIntegration::Rails.check_for_double_boot! - Compass.discover_extensions! - Compass.configure_rails!(app) - end - end -end diff --git a/lib/compass/app_integration/rails/configuration_defaults.rb b/lib/compass/app_integration/rails/configuration_defaults.rb deleted file mode 100644 index f089ee87..00000000 --- a/lib/compass/app_integration/rails/configuration_defaults.rb +++ /dev/null @@ -1,123 +0,0 @@ -module Compass - module AppIntegration - module Rails - - module ConfigurationDefaultsWithAssetPipeline - # These methods overwrite the old rails defaults - # when rails 3.1 is detected. - - def default_sass_dir - File.join("app", "assets", "stylesheets") - end - - def default_images_dir - File.join("app", "assets", "images") - end - - def default_fonts_dir - File.join("app", "assets", "fonts") - end - - def default_javascripts_dir - File.join("app", "assets", "javascripts") - end - - def default_http_path - ::Rails.application.config.assets.prefix - end - - def default_http_images_path - "#{top_level.http_path}" - end - - def default_http_generated_images_path - "#{top_level.http_path}" - end - - def default_http_javascripts_path - "#{top_level.http_path}" - end - - def default_http_fonts_path - "#{top_level.http_path}" - end - - def default_http_stylesheets_path - "#{top_level.http_path}" - end - end - - module ConfigurationDefaults - - def project_type_without_default - :rails - end - - def default_sass_dir - File.join("app", "stylesheets") - end - - def default_css_dir - File.join("public", "stylesheets") - end - - def default_images_dir - File.join("public", "images") - end - - def default_fonts_dir - File.join("public", "fonts") - end - - def default_javascripts_dir - File.join("public", "javascripts") - end - - def default_http_images_path - # Relies on the fact that this will be loaded after the "normal" - # defaults, so that method_missing finds http_root_relative - http_root_relative "images" - end - - def default_http_generated_images_path - # Relies on the fact that this will be loaded after the "normal" - # defaults, so that method_missing finds http_root_relative - http_root_relative "images" - end - - def default_http_javascripts_path - http_root_relative "javascripts" - end - - def default_http_fonts_path - http_root_relative "fonts" - end - - def default_http_stylesheets_path - http_root_relative "stylesheets" - end - - def default_extensions_dir - File.join("vendor", "plugins", "compass_extensions") - end - - def default_cache_dir - File.join("tmp", "sass-cache") - end - - def default_project_path - project_path = Compass::AppIntegration::Rails.root - end - - def default_http_path - "/" # XXX Where is/was this stored in the Rails config? - end - - def default_environment - Compass::AppIntegration::Rails.env - end - - end - end - end -end diff --git a/lib/compass/app_integration/rails/installer.rb b/lib/compass/app_integration/rails/installer.rb deleted file mode 100644 index e4f3db92..00000000 --- a/lib/compass/app_integration/rails/installer.rb +++ /dev/null @@ -1,182 +0,0 @@ -module Compass - module Installers - class Base - end - class ManifestInstaller < Base - end - end - - module AppIntegration - module Rails - class Installer < Compass::Installers::ManifestInstaller - - def completed_configuration - config = {} - config[:sass_dir] = prompt_sass_dir unless sass_dir_without_default - config[:css_dir] = prompt_css_dir unless css_dir_without_default - config unless config.empty? - end - - def write_configuration_files(config_file = nil) - config_file ||= targetize('config/compass.rb') - unless File.exists?(config_file) - directory File.dirname(config_file) - write_file config_file, config_contents - end - unless rails3? - directory File.dirname(targetize('config/initializers/compass.rb')) - write_file targetize('config/initializers/compass.rb'), initializer_contents - end - end - - def rails3? - File.exists?(targetize('config/application.rb')) - end - - def prepare - write_configuration_files - end - - def gem_config_instructions - if rails3? - %Q{Add the following to your Gemfile:\n\n gem "compass", ">= #{Compass::VERSION}"} - else - %Q{Add the following to your environment.rb:\n\n config.gem "compass", :version => ">= #{Compass::VERSION}"} - end - end - - def finalize(options = {}) - if options[:create] - puts <<-NEXTSTEPS - -Congratulations! Your rails project has been configured to use Compass. -Just a couple more things left to do. - -#{gem_config_instructions} - -Then, make sure you restart your server. - -Sass will automatically compile your stylesheets during the next -page request and keep them up to date when they change. -NEXTSTEPS - end - unless options[:prepare] - if manifest.has_stylesheet? - puts "\nNow add these lines to the head of your layout(s):\n\n" - puts stylesheet_links - end - end - end - - def hamlize? - # XXX Is there a better way to detect haml in a particular rails project? - require 'haml' - true - rescue LoadError - false - end - - def install_location_for_html(to, options) - separate("public/#{pattern_name_as_dir}#{to}") - end - - def prompt_sass_dir - if rails3? - nil - else - recommended_location = separate('app/stylesheets') - default_location = separate('public/stylesheets/sass') - print %Q{Compass recommends that you keep your stylesheets in #{recommended_location} - instead of the Sass default location of #{default_location}. - Is this OK? (Y/n) } - answer = $stdin.gets.downcase[0] - answer == ?n ? default_location : recommended_location - end - end - - def prompt_css_dir - if rails3? - nil - else - recommended_location = separate("public/stylesheets/compiled") - default_location = separate("public/stylesheets") - puts - print %Q{Compass recommends that you keep your compiled css in #{recommended_location}/ - instead the Sass default of #{default_location}/. - However, if you're exclusively using Sass, then #{default_location}/ is recommended. - Emit compiled stylesheets to #{recommended_location}/? (Y/n) } - answer = $stdin.gets - answer = answer.downcase[0] - answer == ?n ? default_location : recommended_location - end - end - - def config_contents - project_path, Compass.configuration.project_path = Compass.configuration.project_path, nil - ("# This configuration file works with both the Compass command line tool and within Rails.\n" + - Compass.configuration.serialize) - ensure - Compass.configuration.project_path = project_path - end - - def initializer_contents - %Q{require 'compass' - |require 'compass/app_integration/rails' - |Compass::AppIntegration::Rails.initialize! - |}.gsub(/^\s+\|/,'') - end - - def stylesheet_prefix - if css_dir.length >= 19 - "#{css_dir[19..-1]}/" - else - nil - end - end - - def stylesheet_links - if hamlize? - haml_stylesheet_links - else - html_stylesheet_links - end - end - - def haml_stylesheet_links - html = "%head\n" - manifest.each_stylesheet do |stylesheet| - # Skip partials. - next if File.basename(stylesheet.from)[0..0] == "_" - ss_line = " = stylesheet_link_tag '#{stylesheet_prefix}#{stylesheet.to.sub(/\.s[ac]ss$/,'.css')}'" - if stylesheet.options[:media] - ss_line += ", :media => '#{stylesheet.options[:media]}'" - end - if stylesheet.options[:condition] - ss_line = " /[if #{stylesheet.options[:condition]}]\n " + ss_line - end - html << ss_line + "\n" - end - html - end - def html_stylesheet_links - html = "\n" - manifest.each_stylesheet do |stylesheet| - # Skip partials. - next if File.basename(stylesheet.from)[0..0] == "_" - ss_line = "<%= stylesheet_link_tag '#{stylesheet_prefix}#{stylesheet.to.sub(/\.s[ac]ss$/,'.css')}'" - if stylesheet.options[:media] - ss_line += ", :media => '#{stylesheet.options[:media]}'" - end - ss_line += " %>" - if stylesheet.options[:condition] - ss_line = "" - end - html << " #{ss_line}\n" - end - html << "" - html - end - end - end - end -end diff --git a/lib/compass/app_integration/rails/runtime.rb b/lib/compass/app_integration/rails/runtime.rb deleted file mode 100644 index 423a5eea..00000000 --- a/lib/compass/app_integration/rails/runtime.rb +++ /dev/null @@ -1,17 +0,0 @@ -unless defined?(Compass::RAILS_LOADED) - Compass::RAILS_LOADED = true - begin - require 'action_pack/version' - if ActionPack::VERSION::MAJOR >= 3 - if ActionPack::VERSION::MINOR < 1 - require 'compass/app_integration/rails/actionpack30' - else - require 'compass/app_integration/rails/actionpack31' - end - else - require 'compass/app_integration/rails/actionpack2x' - end - rescue LoadError, NameError => e - $stderr.puts "Compass could not access the rails environment: #{e}" - end -end diff --git a/lib/compass/app_integration/rails/templates/compass-install-rails.rb b/lib/compass/app_integration/rails/templates/compass-install-rails.rb deleted file mode 100644 index aa2b8ce8..00000000 --- a/lib/compass/app_integration/rails/templates/compass-install-rails.rb +++ /dev/null @@ -1,78 +0,0 @@ -# ================================================================= -# Compass Ruby on Rails Installer (template) v.1.0 -# written by Derek Perez (derek@derekperez.com) -# ----------------------------------------------------------------- -# NOTE: This installer is designed to work as a Rails template, -# and can only be used with Rails 2.3+. -# ----------------------------------------------------------------- -# Copyright (c) 2009 Derek Perez -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# ================================================================= - -# Determine if we use sudo, defaults to true unless we are -# on win32, cygwin, or mingw32 or they ask us not to -def sudo_is_an_option? - return false if RUBY_PLATFORM =~ /(win|w)32$/ # true if win32, cygwin or mingw32 - return false if ENV['NO_SUDO'] =~ /true/i - return true -end - -puts "===================================================" -puts "Welcome to the Compass Installer for Ruby on Rails!" -puts "===================================================" -puts - -# css framework prompt -css_framework = ask("What CSS Framework install do you want to use with Compass?") - -# sass storage prompt -sass_dir = ask("Where would you like to keep your sass files within your project? (default: 'app/stylesheets')") -sass_dir = "app/stylesheets" if Compass::Util.blank?(sass_dir) - -# compiled css storage prompt -css_dir = ask("Where would you like Compass to store your compiled css files? (default: 'public/stylesheets/compiled')") -css_dir = "public/stylesheets/compiled" if Compass::Util.blank?(css_dir) - -# use sudo for gem commands? -use_sudo = nil -if sudo_is_an_option? # dont give them the option if they are on a system that can't use sudo (aka windows) - use_sudo = yes?("Use sudo for the gem commands? (the default for your system is #{sudo_is_an_option? ? 'yes' : 'no'})") -end -use_sudo = sudo_is_an_option? if Compass::Util.blank?(use_sudo) - -# define dependencies -gem "haml", :version => ">=3.0.0" -gem "compass", :version => ">= 0.10.0" - -# install and unpack -rake "gems:install GEM=haml --trace", :sudo => use_sudo -rake "gems:install GEM=compass --trace", :sudo => use_sudo -rake "gems:unpack GEM=compass --trace" - -# build out compass command -compass_command = "compass init rails . --css-dir=#{css_dir} --sass-dir=#{sass_dir} " -compass_command << "--using #{css_framework} " unless Compass::Util.blank?(css_framework) - -# integrate it! -run "haml --rails ." -run compass_command From 16fff73ed7627bdee4432e1bcce34f891d4158c5 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 20 Dec 2011 22:25:30 -0500 Subject: [PATCH 204/290] removed rails tests and total rails itegration --- lib/compass/app_integration.rb | 2 +- test/integrations/rails_integration_test.rb | 51 --------------------- test/integrations/test_rails_helper.rb | 20 -------- test/units/rails_configuration_test.rb | 50 -------------------- 4 files changed, 1 insertion(+), 122 deletions(-) delete mode 100644 test/integrations/rails_integration_test.rb delete mode 100644 test/integrations/test_rails_helper.rb delete mode 100644 test/units/rails_configuration_test.rb diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index bede6075..60b1c92f 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -1,4 +1,4 @@ -%w(stand_alone rails merb).each do |lib| +%w(stand_alone merb).each do |lib| require "compass/app_integration/#{lib}" end diff --git a/test/integrations/rails_integration_test.rb b/test/integrations/rails_integration_test.rb deleted file mode 100644 index 622432a7..00000000 --- a/test/integrations/rails_integration_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'test_helper' -require 'fileutils' -require 'compass' -require 'compass/exec' -require 'timeout' - -class RailsIntegrationTest < Test::Unit::TestCase - include Compass::CommandLineHelper - include Compass::IoHelper - include Compass::RailsHelper - - def setup - Compass.reset_configuration! - end - - def test_rails_install - within_tmp_directory do - begin - generate_rails_app_directories("compass_rails") - Dir.chdir "compass_rails" do - compass(*%w(init rails --trace --boring .)) do |responder| - responder.respond_to %r{^\s*Is this OK\? \(Y/n\)\s*$}, :with => "Y" - responder.respond_to %r{^\s*Emit compiled stylesheets to public/stylesheets/compiled/\? \(Y/n\)\s*$}, :with => "Y" - end - # puts ">>>#{@last_result}<<<" - assert_action_performed :create, "./app/stylesheets/screen.scss" - assert_action_performed :create, "./config/initializers/compass.rb" - end - ensure - FileUtils.rm_rf "compass_rails" - end - end - rescue LoadError - puts "Skipping rails test. Couldn't Load rails" - rescue NotImplementedError => e - puts "Skipping rails test: #{e}" - end - - def test_rails_install_with_no_dialog - within_tmp_directory do - generate_rails_app_directories("compass_rails") - Dir.chdir "compass_rails" do - compass(*%w(init rails --trace --boring --sass-dir app/stylesheets --css-dir public/stylesheets/compiled .)) - assert_action_performed :create, "./app/stylesheets/screen.scss" - assert_action_performed :create, "./config/initializers/compass.rb" - end - end - rescue LoadError - puts "Skipping rails test. Couldn't Load rails" - end -end diff --git a/test/integrations/test_rails_helper.rb b/test/integrations/test_rails_helper.rb deleted file mode 100644 index 6cbb80f2..00000000 --- a/test/integrations/test_rails_helper.rb +++ /dev/null @@ -1,20 +0,0 @@ -# XXX This file isn't in use at the moment, but will be used to help test -# XXX deep rails integration of compass features. -need_gems = false - -# allows testing with edge Rails by creating a test/rails symlink -RAILS_ROOT = linked_rails = File.dirname(__FILE__) + '/rails' -RAILS_ENV = 'test' - -if File.exists?(linked_rails) && !$:.include?(linked_rails + '/activesupport/lib') - puts "[ using linked Rails ]" - $:.unshift linked_rails + '/activesupport/lib' - $:.unshift linked_rails + '/actionpack/lib' -else - need_gems = true -end - -require 'rubygems' if need_gems - -require 'action_controller' -require 'action_view' diff --git a/test/units/rails_configuration_test.rb b/test/units/rails_configuration_test.rb deleted file mode 100644 index da298538..00000000 --- a/test/units/rails_configuration_test.rb +++ /dev/null @@ -1,50 +0,0 @@ -require 'test_helper' -require 'compass' -require 'stringio' - -class ConfigurationTest < Test::Unit::TestCase - - setup do - Compass.reset_configuration! - end - - after do - Compass.reset_configuration! - end - - def test_defaults - contents = StringIO.new(<<-CONFIG) - project_type = :rails - CONFIG - config = Compass.configuration_for(contents, "config/compass.rb") - - Compass.add_project_configuration(config, :project_type => "rails") - - assert_equal 'public/images', Compass.configuration.images_dir - assert_equal 'public/stylesheets', Compass.configuration.css_dir - assert_equal 'public/fonts', Compass.configuration.fonts_dir - - assert_equal '/', Compass.configuration.http_path - assert_equal '/images', Compass.configuration.http_images_path - assert_equal '/stylesheets', Compass.configuration.http_stylesheets_path - assert_equal '/fonts', Compass.configuration.http_fonts_path - - # Other default values must wait until I have a better idea of how to mock Sass::Util.app_geq - end - - def test_http_path_change - contents = StringIO.new(<<-CONFIG) - project_type = :rails - - http_path = "/test/alternative_path" - CONFIG - config = Compass.configuration_for(contents, "config/compass.rb") - - Compass.add_project_configuration(config, :project_type => "rails") - - assert_equal '/test/alternative_path', Compass.configuration.http_path - assert_equal '/test/alternative_path/images', Compass.configuration.http_images_path - assert_equal '/test/alternative_path/stylesheets', Compass.configuration.http_stylesheets_path - assert_equal '/test/alternative_path/fonts', Compass.configuration.http_fonts_path - end -end From c669be8888753a50f950be66431e4923b071c871 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 22 Dec 2011 13:23:45 -0500 Subject: [PATCH 205/290] removed rails features --- features/command_line.feature | 10 ------ features/extensions.feature | 10 ------ features/rails_integration.feature | 32 ------------------- .../step_definitions/command_line_steps.rb | 12 ------- 4 files changed, 64 deletions(-) delete mode 100644 features/rails_integration.feature diff --git a/features/command_line.feature b/features/command_line.feature index 69a89ced..f0ffbba3 100644 --- a/features/command_line.feature +++ b/features/command_line.feature @@ -77,16 +77,6 @@ Feature: Command Line Then an error message is printed out: A bare project cannot be created when a framework is specified. And the command exits with a non-zero error code - Scenario: Initializing a rails project - Given ruby supports fork - Given I'm in a newly created rails project: my_rails_project - When I initialize a project using: compass init rails --sass-dir app/stylesheets --css-dir public/stylesheets/compiled - Then a config file config/compass.rb is reported created - Then a config file config/compass.rb is created - And a sass file app/stylesheets/screen.scss is created - And a sass file app/stylesheets/print.scss is created - And a sass file app/stylesheets/ie.scss is created - Scenario: Compiling an existing project. Given I am using the existing project in test/fixtures/stylesheets/compass When I run: compass compile diff --git a/features/extensions.feature b/features/extensions.feature index a4f15803..80730722 100644 --- a/features/extensions.feature +++ b/features/extensions.feature @@ -12,16 +12,6 @@ Feature: Extensions When I run: compass frameworks Then the list of frameworks includes "testing" - @listframeworks - Scenario: Extensions directory for rails projects - Given ruby supports fork - And I'm in a newly created rails project: extension_test_rails_project - And I run: compass init rails - And the "vendor/plugins/compass_extensions" directory exists - And and I have a fake extension at vendor/plugins/compass_extensions/testing - When I run: compass frameworks - Then the list of frameworks includes "testing" - @listframeworks Scenario: Shared extensions directory Given the "~/.compass/extensions" directory exists diff --git a/features/rails_integration.feature b/features/rails_integration.feature deleted file mode 100644 index ec3df97c..00000000 --- a/features/rails_integration.feature +++ /dev/null @@ -1,32 +0,0 @@ -Feature: Rails Integration - In order to provide an integrated experience - As a Ruby on Rails user - I want to easily access the Compass functionality - - Scenario: Configure Compass from my Application - Given I'm in a rails3.1 application named 'exemplar' - When I edit 'config/application.rb' and save it with the following value: - """ - require File.expand_path('../boot', __FILE__) - require 'rails/all' - Bundler.require(:default, Rails.env) if defined?(Bundler) - module Exemplar - class Application < Rails::Application - config.encoding = "utf-8" - config.filter_parameters += [:password] - - config.compass.fonts_dir = "app/assets/fonts" - end - end - """ - And I run: compass config -p fonts_dir - Then the command should print out "app/assets/fonts" - Scenario: Rails gets access to the compass config file - Given I'm in a rails3.1 application named 'exemplar' - When I edit 'config/compass.rb' and save it with the following value: - """ - fonts_dir = "app/assets/fonts" - """ - And I run: ruby -I. -rconfig/environment -e 'puts Compass.configuration.fonts_dir' - Then the command should print out "app/assets/fonts" - diff --git a/features/step_definitions/command_line_steps.rb b/features/step_definitions/command_line_steps.rb index 534bbcec..af6eb782 100644 --- a/features/step_definitions/command_line_steps.rb +++ b/features/step_definitions/command_line_steps.rb @@ -6,7 +6,6 @@ require 'compass/exec' include Compass::TestCaseHelper include Compass::CommandLineHelper include Compass::IoHelper -include Compass::RailsHelper Before do Compass.reset_configuration! @@ -41,17 +40,6 @@ Given %r{^I am in the parent directory$} do Dir.chdir ".." end -Given %r{^I'm in a newly created rails project: (.+)$} do |project_name| - dir = File.join(Dir.pwd, project_name) - @cleanup_directories << dir - begin - generate_rails_app project_name, Dir.pwd - Dir.chdir dir - rescue LoadError - pending "Missing Ruby-on-rails gems: sudo gem install rails" - end -end - Given /^I should clean up the directory: (\w+)$/ do |directory| @cleanup_directories << directory end From e6b967a8c356ee65445fbe4d72cb61de7fb2110a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 23 Dec 2011 16:22:35 -0800 Subject: [PATCH 206/290] Make the -line-padding variable in the vertical rhythm module configurable. --- .../stylesheets/compass/typography/_vertical_rhythm.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss index 5b9736d5..9d7009cc 100644 --- a/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss +++ b/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss @@ -22,7 +22,7 @@ $round-to-nearest-half-line: false !default; // Ensure there is at least this many pixels // of vertical padding above and below the text. -$min-line-padding: 2px; +$min-line-padding: 2px !default; // $base-font-size but in your output unit of choice. // Defaults to 1em when `$relative-font-sizing` From 3110fc5d9e0055c2b6da3c300133349937719a64 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 23 Dec 2011 16:23:05 -0800 Subject: [PATCH 207/290] Support for new versions of sass where the callback name changed. --- lib/compass/configuration/helpers.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index b6396bc1..12a49030 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -67,9 +67,13 @@ module Compass end end unless @callbacks_loaded - - Sass::Plugin.on_updated_stylesheet do |sass_file, css_file| - Compass.configuration.run_stylesheet_saved(css_file) + on_saved = Proc.new do |sass_file, css_file| + Compass.configuration.run_stylesheet_saved(css_file) + end + if Sass::Plugin.respond_to?(:on_updated_stylesheet) + Sass::Plugin.on_updated_stylesheet(&on_saved) + else + Sass::Plugin.on_updating_stylesheet(&on_saved) end Sass::Plugin.on_compilation_error do |e, filename, css| From 4171c0eef73b0817c971bfceb3cc92bb0bf4df49 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 23 Dec 2011 17:26:10 -0800 Subject: [PATCH 208/290] update changelog for release --- doc-src/content/CHANGELOG.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index b1225bf8..9f4e60bb 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,15 +14,15 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.alpha.3 (UNRELEASED) +0.12.alpha.3 (12/23/2011) ------------------------- * The `$round-to-nearest-half-line` config variable was added. When true, the vertical rhythm module will round line heights to the nearest half-line to avoid awkwardly large gaps between lines of text. Defaults to false. - * Added `reset-baseline` to the vertical rhythm module so you can force the baseline to reset. +* Merges in the stable changes between 0.11.5 and 0.11.6. 0.12.alpha.2 (11/28/2011) ------------------------- From 0f0c92e1bbdec51103d30174f638f3302fc0c04b Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 00:14:48 -0500 Subject: [PATCH 209/290] added -ms prefix to transitions via #590 --- .../stylesheets/compass/css3/_transition.scss | 14 +++++++------- .../stylesheets/compass/css/transition.css | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index f747698b..d2ee7bb2 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -30,7 +30,7 @@ $default-transition-delay: false !default; @mixin transition-property($properties: $default-transition-property) { @include experimental(transition-property, unquote($properties), - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, -o, -ms, not -khtml, official ); } @@ -42,7 +42,7 @@ $default-transition-delay: false !default; @mixin transition-duration($duration: $default-transition-duration) { @if type-of($duration) == string { $duration: unquote($duration); } @include experimental(transition-duration, $duration, - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, -o, -ms, not -khtml, official ); } @@ -54,7 +54,7 @@ $default-transition-delay: false !default; @mixin transition-timing-function($function: $default-transition-function) { @include experimental(transition-timing-function, unquote($function), - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, -o, -ms, not -khtml, official ); } @@ -66,7 +66,7 @@ $default-transition-delay: false !default; @mixin transition-delay($delay: $default-transition-delay) { @if type-of($delay) == string { $delay: unquote($delay); } @include experimental(transition-delay, $delay, - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, -o, -ms, not -khtml, official ); } @@ -87,7 +87,7 @@ $default-transition-delay: false !default; -moz, not -webkit, -o, - not -ms, + -ms, not -khtml, official ); @@ -97,7 +97,7 @@ $default-transition-delay: false !default; -moz, -webkit, -o, - not -ms, + -ms, not -khtml, official ); @@ -128,6 +128,6 @@ $default-transition-delay: false !default; } $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); @include experimental(transition, $transition, - -moz, -webkit, -o, not -ms, not -khtml, official + -moz, -webkit, -o, -ms, not -khtml, official ); } diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 3c3a8ae2..2671cb7a 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -1,6 +1,7 @@ .single-transition-without-delay { -webkit-transition: all 0.6s ease-out; -moz-transition: all 0.6s ease-out; + -ms-transition: all 0.6s ease-out; -o-transition: all 0.6s ease-out; transition: all 0.6s ease-out; } @@ -8,5 +9,6 @@ -webkit-transition: all 0.6s ease-out; -webkit-transition-delay: 0.2s; -moz-transition: all 0.6s ease-out 0.2s; + -ms-transition: all 0.6s ease-out 0.2s; -o-transition: all 0.6s ease-out 0.2s; transition: all 0.6s ease-out 0.2s; } From dec5c9cb3ba548f749be52547a0ea1f458d8752e Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 00:32:46 -0500 Subject: [PATCH 210/290] added test for alternating rows and columns --- .../tables/_alternating-rows-and-columns.scss | 12 ++++++----- .../stylesheets/compass/css/utilities.css | 20 +++++++++++++++++++ .../stylesheets/compass/sass/utilities.scss | 3 +++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss b/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss index 8dd3a714..4da78e24 100644 --- a/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +++ b/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss @@ -3,11 +3,13 @@ background-color: $header-color; &.even, &:nth-child(2n) { background-color: $header-color - $dark-intersection; } } - tr.odd { - td { - background-color: $odd-row-color; - &.even, &:nth-child(2n) { - background-color: $odd-row-color - $dark-intersection; } } } + tr { + &.odd, &:nth-child(2n+1) { + td { + background-color: $odd-row-color; + &.even, &:nth-child(2n) { + background-color: $odd-row-color - $dark-intersection; } } } + } tr.even { td { background-color: $even-row-color; diff --git a/test/fixtures/stylesheets/compass/css/utilities.css b/test/fixtures/stylesheets/compass/css/utilities.css index 8a6c64b1..188e1e61 100644 --- a/test/fixtures/stylesheets/compass/css/utilities.css +++ b/test/fixtures/stylesheets/compass/css/utilities.css @@ -34,3 +34,23 @@ p.light-with-args { p.dark-with-args { background-color: #5f1210; color: blue; } + +th { + background-color: white; } + th.even, th:nth-child(2n) { + background-color: yellow; } + +tr.odd td, tr:nth-child(2n+1) td { + background-color: white; } + tr.odd td.even, tr.odd td:nth-child(2n), tr:nth-child(2n+1) td.even, tr:nth-child(2n+1) td:nth-child(2n) { + background-color: yellow; } + +tr.even td { + background-color: red; } + tr.even td.even, tr.even td:nth-child(2n) { + background-color: red; } + +tfoot th, tfoot td { + background-color: white; } + tfoot th.even, tfoot th:nth-child(2n), tfoot td.even, tfoot td:nth-child(2n) { + background-color: yellow; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/utilities.scss b/test/fixtures/stylesheets/compass/sass/utilities.scss index d579a6ca..14eadfa2 100644 --- a/test/fixtures/stylesheets/compass/sass/utilities.scss +++ b/test/fixtures/stylesheets/compass/sass/utilities.scss @@ -15,3 +15,6 @@ p.light { @include contrasted(#B0201E); } p.dark { @include contrasted(#5F1210); } p.light-with-args { @include contrasted(#B0201E, green, blue); } p.dark-with-args { @include contrasted(#5F1210, green, blue); } + + +@include alternating-rows-and-columns(red, white, blue); From 6c98ff1d5cc043d936d60b637e504cebd98ee83b Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 00:48:43 -0500 Subject: [PATCH 211/290] removed ms prefix from box-sizing and added a test case --- .../compass/stylesheets/compass/css3/_box-sizing.scss | 2 +- test/fixtures/stylesheets/compass/css/box-sizeing.css | 9 +++++++++ test/fixtures/stylesheets/compass/sass/box-sizeing.scss | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/stylesheets/compass/css/box-sizeing.css create mode 100644 test/fixtures/stylesheets/compass/sass/box-sizeing.scss diff --git a/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss b/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss index 5f480ac2..93ff8ac0 100644 --- a/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss +++ b/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss @@ -8,6 +8,6 @@ @mixin box-sizing($bs) { $bs: unquote($bs); @include experimental(box-sizing, $bs, - -moz, -webkit, not -o, -ms, not -khtml, official + -moz, -webkit, not -o, not -ms, not -khtml, official ); } diff --git a/test/fixtures/stylesheets/compass/css/box-sizeing.css b/test/fixtures/stylesheets/compass/css/box-sizeing.css new file mode 100644 index 00000000..410f7d76 --- /dev/null +++ b/test/fixtures/stylesheets/compass/css/box-sizeing.css @@ -0,0 +1,9 @@ +.div { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +.div { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } diff --git a/test/fixtures/stylesheets/compass/sass/box-sizeing.scss b/test/fixtures/stylesheets/compass/sass/box-sizeing.scss new file mode 100644 index 00000000..1338ee8e --- /dev/null +++ b/test/fixtures/stylesheets/compass/sass/box-sizeing.scss @@ -0,0 +1,8 @@ +@import "compass/css3/box-sizing"; + +.div { + @include box-sizing(content-box); +} +.div { + @include box-sizing(border-box); +} \ No newline at end of file From f4dda8a5d02318d01aa60583e5c25e8a9b064ad9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 01:01:11 -0500 Subject: [PATCH 212/290] added sprite_names sass function and test closes #620 --- .../sass_extensions/functions/sprites.rb | 7 +++++ test/integrations/sprites_test.rb | 28 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb index d68fd586..b8e97d4c 100644 --- a/lib/compass/sass_extensions/functions/sprites.rb +++ b/lib/compass/sass_extensions/functions/sprites.rb @@ -9,6 +9,13 @@ module Compass::SassExtensions::Functions::Sprites self[variable_name.to_s.gsub(/-/,"_")] end end + + #Returns a list of all sprite names + def sprite_names(map) + Sass::Script::List.new(map.sprite_names.map { |f| Sass::Script::String.new(f) }, ' ') + end + Sass::Script::Functions.declare :sprite_names, [:map] + # Returns the system path of the sprite file def sprite_path(map) Sass::Script::String.new(map.name_and_hash) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index e1ef64a8..3284f995 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -807,11 +807,37 @@ class SpritesTest < Test::Unit::TestCase } .colors-blue { background-position:0 0; - }.colors-yellow { + } + .colors-yellow { background-position:0 -10px; } CSS assert_correct clean(css), clean(other_css) end + it "should have a sprite_name function that returns the names of the sprites in a sass list" do + css = render <<-SCSS + $colors-inline:true; + @import "colors/*.png"; + @each $color in sprite_names($colors-sprites) { + .\#{$color} { + width:0px; + } + } + SCSS + other_css = <<-CSS + .colors-sprite { + background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAUCAAAAACRhfOKAAAAHElEQVR42mM5wQADLP8JMRlIUIvE/IdgctLTNgCHDhEQVD4ceAAAAABJRU5ErkJggg=='); + } + .blue { + width:0px; + } + .yellow { + width:0px; + } + CSS + assert_correct clean(css), clean(other_css) + + end + end From a7a8ccab622962fd89642d35af0f6aea5f0edec4 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 01:30:10 -0500 Subject: [PATCH 213/290] added tests for transition-duration via #575 --- .../stylesheets/compass/css/transition.css | 14 ++++++++++++++ .../stylesheets/compass/sass/transition.scss | 2 ++ 2 files changed, 16 insertions(+) diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 2671cb7a..1d34c025 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -12,3 +12,17 @@ -ms-transition: all 0.6s ease-out 0.2s; -o-transition: all 0.6s ease-out 0.2s; transition: all 0.6s ease-out 0.2s; } + +.transition-duration-string { + -webkit-transition-duration: 0.2s, 0.5s, 0.2s; + -moz-transition-duration: 0.2s, 0.5s, 0.2s; + -ms-transition-duration: 0.2s, 0.5s, 0.2s; + -o-transition-duration: 0.2s, 0.5s, 0.2s; + transition-duration: 0.2s, 0.5s, 0.2s; } + +.transition-duration-list { + -webkit-transition-duration: 0.2s, 0.5s, 0.2s; + -moz-transition-duration: 0.2s, 0.5s, 0.2s; + -ms-transition-duration: 0.2s, 0.5s, 0.2s; + -o-transition-duration: 0.2s, 0.5s, 0.2s; + transition-duration: 0.2s, 0.5s, 0.2s; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss index 8cee1166..9fa9edde 100644 --- a/test/fixtures/stylesheets/compass/sass/transition.scss +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -2,3 +2,5 @@ .single-transition-without-delay { @include single-transition(all, 0.6s, ease-out); } .single-transition-with-delay { @include single-transition(all, 0.6s, ease-out, 0.2s); } +.transition-duration-string { @include transition-duration("0.2s, 0.5s, 0.2s"); } +.transition-duration-list { @include transition-duration((0.2s, 0.5s, 0.2s)); } \ No newline at end of file From 3d23b36f6397bd01f0c8a6bf14122730aa5e86b3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 02:29:16 -0500 Subject: [PATCH 214/290] inital implimentation of border-image --- frameworks/compass/stylesheets/compass/_css3.scss | 1 + .../stylesheets/compass/css3/_border-image.scss | 15 +++++++++++++++ .../stylesheets/compass/css/border-image.css | 5 +++++ .../stylesheets/compass/sass/border-image.scss | 3 +++ 4 files changed, 24 insertions(+) create mode 100644 frameworks/compass/stylesheets/compass/css3/_border-image.scss create mode 100644 test/fixtures/stylesheets/compass/css/border-image.css create mode 100644 test/fixtures/stylesheets/compass/sass/border-image.scss diff --git a/frameworks/compass/stylesheets/compass/_css3.scss b/frameworks/compass/stylesheets/compass/_css3.scss index 3ca84aa0..aacea648 100644 --- a/frameworks/compass/stylesheets/compass/_css3.scss +++ b/frameworks/compass/stylesheets/compass/_css3.scss @@ -1,4 +1,5 @@ @import "css3/border-radius"; +@import "css3/border-image"; @import "css3/inline-block"; @import "css3/opacity"; @import "css3/box-shadow"; diff --git a/frameworks/compass/stylesheets/compass/css3/_border-image.scss b/frameworks/compass/stylesheets/compass/css3/_border-image.scss new file mode 100644 index 00000000..36222230 --- /dev/null +++ b/frameworks/compass/stylesheets/compass/css3/_border-image.scss @@ -0,0 +1,15 @@ +@import "shared"; +//border-image: source slice width outset repeat +// defaults none 100% 1 0 stretch via http://www.w3schools.com/cssref/css3_pr_border-image.asp + +@mixin border-image($source, $slice:100%, $width:1, $outset:0, $repeat:'stretch') { + $value: (image_url($source), $slice, $width, $outset, $repeat); + @include experimental(border-image, $value, + -moz, + -webkit, + -o, + not -ms, + not -khtml, + official + ); + } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/css/border-image.css b/test/fixtures/stylesheets/compass/css/border-image.css new file mode 100644 index 00000000..19bc690b --- /dev/null +++ b/test/fixtures/stylesheets/compass/css/border-image.css @@ -0,0 +1,5 @@ +.simple { + -webkit-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; + -moz-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; + -o-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; + border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/border-image.scss b/test/fixtures/stylesheets/compass/sass/border-image.scss new file mode 100644 index 00000000..b0ea33f7 --- /dev/null +++ b/test/fixtures/stylesheets/compass/sass/border-image.scss @@ -0,0 +1,3 @@ +@import "compass/css3/border-image"; + +.simple { @include border-image("100x150.jpeg"); } \ No newline at end of file From 9c0539aadf6e144ab54c2d6e33694131a4bf853f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 02:46:19 -0500 Subject: [PATCH 215/290] docs for border-image --- .../reference/compass/css3/border_image.haml | 15 +++++++++++++++ .../stylesheets/compass/css3/_border-image.scss | 10 +++++++++- .../stylesheets/compass/css3/_border-radius.scss | 1 + .../stylesheets/compass/css/border-image.css | 8 ++++---- 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 doc-src/content/reference/compass/css3/border_image.haml diff --git a/doc-src/content/reference/compass/css3/border_image.haml b/doc-src/content/reference/compass/css3/border_image.haml new file mode 100644 index 00000000..2067cd2c --- /dev/null +++ b/doc-src/content/reference/compass/css3/border_image.haml @@ -0,0 +1,15 @@ +--- +title: Compass Border Image +crumb: Border Image +framework: compass +stylesheet: compass/css3/_border-image.scss +meta_description: Specify the border image for all browsers. +layout: core +classnames: + - reference + - core + - css3 +--- +- render 'reference' do + %p + The border-image mixin is used to give a block element an image to be used instead of the normal border. It automatically outputs the correct vendor specific syntax for each browser (e.g. -webkit-border-image and -moz-border-image). See CSS3 spec: border-image. diff --git a/frameworks/compass/stylesheets/compass/css3/_border-image.scss b/frameworks/compass/stylesheets/compass/css3/_border-image.scss index 36222230..e0829d02 100644 --- a/frameworks/compass/stylesheets/compass/css3/_border-image.scss +++ b/frameworks/compass/stylesheets/compass/css3/_border-image.scss @@ -2,7 +2,15 @@ //border-image: source slice width outset repeat // defaults none 100% 1 0 stretch via http://www.w3schools.com/cssref/css3_pr_border-image.asp -@mixin border-image($source, $slice:100%, $width:1, $outset:0, $repeat:'stretch') { +$default-border-image-slice : 100% !default; +$default-border-image-width : 1 !default; +$default-border-image-outset : 0 !default; + +// repeated | rounded | stretched +$default-border-image-repeat : unquote('stretch') !default; + +// The border-image is used to give a block element an image to be used instead of the normal border. +@mixin border-image($source, $slice:$default-border-image-slice, $width:$default-border-image-width, $outset:$default-border-image-outset, $repeat:$default-border-image-repeat) { $value: (image_url($source), $slice, $width, $outset, $repeat); @include experimental(border-image, $value, -moz, diff --git a/frameworks/compass/stylesheets/compass/css3/_border-radius.scss b/frameworks/compass/stylesheets/compass/css3/_border-radius.scss index 4870b1e9..d367a97c 100644 --- a/frameworks/compass/stylesheets/compass/css3/_border-radius.scss +++ b/frameworks/compass/stylesheets/compass/css3/_border-radius.scss @@ -17,6 +17,7 @@ $default-border-radius: 5px !default; // .crazy { @include border-radius(1px 3px 5px 7px, 2px 4px 6px 8px)} // // Which generates: +// // .simple { // -webkit-border-radius: 4px 4px; // -moz-border-radius: 4px / 4px; diff --git a/test/fixtures/stylesheets/compass/css/border-image.css b/test/fixtures/stylesheets/compass/css/border-image.css index 19bc690b..5a86f37e 100644 --- a/test/fixtures/stylesheets/compass/css/border-image.css +++ b/test/fixtures/stylesheets/compass/css/border-image.css @@ -1,5 +1,5 @@ .simple { - -webkit-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; - -moz-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; - -o-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; - border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, "stretch"; } \ No newline at end of file + -webkit-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; + -moz-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; + -o-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; + border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; } \ No newline at end of file From f8378d039db5f4a9fd318596798e43b941cf6852 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 02:49:08 -0500 Subject: [PATCH 216/290] changelog updated --- doc-src/content/CHANGELOG.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 9f4e60bb..415043ad 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,6 +14,14 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.alpha.3 (UNRELEASED) +------------------------- + +* Added css3 `border-image` support +* Removed -ms prefix from box-sizing +* Added sprite_names sass function +* Added -ms prefix to transitions + 0.12.alpha.3 (12/23/2011) ------------------------- From a8e48c5a2ab5f6fde9e5d8dffb440119391d84ae Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 02:49:38 -0500 Subject: [PATCH 217/290] added support for --debug-info and --no-debug-info to compass compile --- lib/compass/commands/update_project.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/compass/commands/update_project.rb b/lib/compass/commands/update_project.rb index 3edd6074..66098d34 100644 --- a/lib/compass/commands/update_project.rb +++ b/lib/compass/commands/update_project.rb @@ -17,6 +17,14 @@ module Compass opts.on("--time", "Display compilation times.") do self.options[:time] = true end + + opts.on("--debug-info", "Turns on sass's debuging information") do + self.options[:debug_info]= true + end + + opts.on("--no-debug-info", "Turns on sass's debuging information") do + self.options[:debug_info]= false + end super end end @@ -56,6 +64,10 @@ module Compass compiler_opts.merge!(options) compiler_opts[:sass_files] = explicit_sass_files compiler_opts[:cache_location] = determine_cache_location + if options.include?(:debug_info) && options[:debug_info] + compiler_opts[:sass][:debug_info] = options.delete(:debug_info) + end + puts compiler_opts.inspect compiler_opts end From 49faec17567f1f5ac80c011038dfe058d8b86888 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 02:50:06 -0500 Subject: [PATCH 218/290] changelog --- doc-src/content/CHANGELOG.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 415043ad..c0579cc6 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -21,6 +21,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Removed -ms prefix from box-sizing * Added sprite_names sass function * Added -ms prefix to transitions +* Added support for `--debug-info` and `--no-debug-info` to compass compile 0.12.alpha.3 (12/23/2011) ------------------------- From cf4805958d92c82be782f7d7b8f54304af7369e6 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 11:27:20 -0500 Subject: [PATCH 219/290] app integration --- lib/compass/app_integration.rb | 25 +++++++++++++++++++++---- lib/compass/configuration/helpers.rb | 7 ------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index 60b1c92f..a8e1beb9 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -5,10 +5,26 @@ end module Compass module AppIntegration module Helpers - def lookup(project_type) - eval "Compass::AppIntegration::#{camelize(project_type)}" - rescue NameError - raise Compass::Error, "No application integration exists for #{project_type}" + attr_accessor :project_types + DEAFULT_PROJECT_TYPES = { + :merb => "Compass::AppIntegration::Merb", + :stand_alone => "Compass::AppIntegration::StandAlone" + } + + def init + @project_types ||= DEAFULT_PROJECT_TYPES + end + + def lookup(type) + unless @project_types[type].nil? + eval @project_types[type] + else + raise Compass::Error, "No application integration exists for #{type}" + end + end + + def register(type, klass) + @project_types[type] = klass end protected @@ -20,5 +36,6 @@ module Compass end extend Helpers + init end end diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index b6396bc1..5e5b874e 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -80,13 +80,6 @@ module Compass end end - def configure_rails!(app) - return unless app.config.respond_to?(:sass) - app.config.compass.to_sass_engine_options.each do |key, value| - app.config.sass.send(:"#{key}=", value) - end - end - def sass_engine_options configuration.to_sass_engine_options end From 88aa3b3c7e413ca4832f9b37efdb91ffba8a159f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 11:32:10 -0500 Subject: [PATCH 220/290] removed border-image ... someone needs to learn to close old issues =( --- .../reference/compass/css3/border_image.haml | 15 ------------ .../compass/stylesheets/compass/_css3.scss | 1 - .../compass/css3/_border-image.scss | 23 ------------------- .../stylesheets/compass/css/border-image.css | 5 ---- .../compass/sass/border-image.scss | 3 --- 5 files changed, 47 deletions(-) delete mode 100644 doc-src/content/reference/compass/css3/border_image.haml delete mode 100644 frameworks/compass/stylesheets/compass/css3/_border-image.scss delete mode 100644 test/fixtures/stylesheets/compass/css/border-image.css delete mode 100644 test/fixtures/stylesheets/compass/sass/border-image.scss diff --git a/doc-src/content/reference/compass/css3/border_image.haml b/doc-src/content/reference/compass/css3/border_image.haml deleted file mode 100644 index 2067cd2c..00000000 --- a/doc-src/content/reference/compass/css3/border_image.haml +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Compass Border Image -crumb: Border Image -framework: compass -stylesheet: compass/css3/_border-image.scss -meta_description: Specify the border image for all browsers. -layout: core -classnames: - - reference - - core - - css3 ---- -- render 'reference' do - %p - The border-image mixin is used to give a block element an image to be used instead of the normal border. It automatically outputs the correct vendor specific syntax for each browser (e.g. -webkit-border-image and -moz-border-image). See CSS3 spec: border-image. diff --git a/frameworks/compass/stylesheets/compass/_css3.scss b/frameworks/compass/stylesheets/compass/_css3.scss index aacea648..3ca84aa0 100644 --- a/frameworks/compass/stylesheets/compass/_css3.scss +++ b/frameworks/compass/stylesheets/compass/_css3.scss @@ -1,5 +1,4 @@ @import "css3/border-radius"; -@import "css3/border-image"; @import "css3/inline-block"; @import "css3/opacity"; @import "css3/box-shadow"; diff --git a/frameworks/compass/stylesheets/compass/css3/_border-image.scss b/frameworks/compass/stylesheets/compass/css3/_border-image.scss deleted file mode 100644 index e0829d02..00000000 --- a/frameworks/compass/stylesheets/compass/css3/_border-image.scss +++ /dev/null @@ -1,23 +0,0 @@ -@import "shared"; -//border-image: source slice width outset repeat -// defaults none 100% 1 0 stretch via http://www.w3schools.com/cssref/css3_pr_border-image.asp - -$default-border-image-slice : 100% !default; -$default-border-image-width : 1 !default; -$default-border-image-outset : 0 !default; - -// repeated | rounded | stretched -$default-border-image-repeat : unquote('stretch') !default; - -// The border-image is used to give a block element an image to be used instead of the normal border. -@mixin border-image($source, $slice:$default-border-image-slice, $width:$default-border-image-width, $outset:$default-border-image-outset, $repeat:$default-border-image-repeat) { - $value: (image_url($source), $slice, $width, $outset, $repeat); - @include experimental(border-image, $value, - -moz, - -webkit, - -o, - not -ms, - not -khtml, - official - ); - } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/css/border-image.css b/test/fixtures/stylesheets/compass/css/border-image.css deleted file mode 100644 index 5a86f37e..00000000 --- a/test/fixtures/stylesheets/compass/css/border-image.css +++ /dev/null @@ -1,5 +0,0 @@ -.simple { - -webkit-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; - -moz-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; - -o-border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; - border-image: url('/images/100x150.jpeg?busted=true'), 100%, 1, 0, stretch; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/border-image.scss b/test/fixtures/stylesheets/compass/sass/border-image.scss deleted file mode 100644 index b0ea33f7..00000000 --- a/test/fixtures/stylesheets/compass/sass/border-image.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "compass/css3/border-image"; - -.simple { @include border-image("100x150.jpeg"); } \ No newline at end of file From f1a6d3a8aa5ee4f74ac3a66644ca5ac0d8aed779 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 11:33:16 -0500 Subject: [PATCH 221/290] changlog --- doc-src/content/CHANGELOG.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index c0579cc6..6159736d 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -17,7 +17,6 @@ The Documentation for the [latest preview release](http://beta.compass-style.org 0.12.alpha.3 (UNRELEASED) ------------------------- -* Added css3 `border-image` support * Removed -ms prefix from box-sizing * Added sprite_names sass function * Added -ms prefix to transitions From b87dffb990828a85e1e9eb14cf550244e68ea5a9 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 2 Jan 2012 20:44:54 -0500 Subject: [PATCH 222/290] removed merb --- lib/compass/app_integration.rb | 8 --- lib/compass/app_integration/merb.rb | 1 - lib/compass/app_integration/merb/runtime.rb | 63 --------------------- 3 files changed, 72 deletions(-) delete mode 100644 lib/compass/app_integration/merb.rb delete mode 100644 lib/compass/app_integration/merb/runtime.rb diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index a8e1beb9..ed650b32 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -7,7 +7,6 @@ module Compass module Helpers attr_accessor :project_types DEAFULT_PROJECT_TYPES = { - :merb => "Compass::AppIntegration::Merb", :stand_alone => "Compass::AppIntegration::StandAlone" } @@ -27,13 +26,6 @@ module Compass @project_types[type] = klass end - protected - - # Stolen from ActiveSupport - def camelize(s) - s.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } - end - end extend Helpers init diff --git a/lib/compass/app_integration/merb.rb b/lib/compass/app_integration/merb.rb deleted file mode 100644 index 546ac987..00000000 --- a/lib/compass/app_integration/merb.rb +++ /dev/null @@ -1 +0,0 @@ -require 'compass/app_integration/merb/runtime' if defined?(Merb::Plugins) diff --git a/lib/compass/app_integration/merb/runtime.rb b/lib/compass/app_integration/merb/runtime.rb deleted file mode 100644 index 883c4de7..00000000 --- a/lib/compass/app_integration/merb/runtime.rb +++ /dev/null @@ -1,63 +0,0 @@ -# To configure Merb to use compass do the following: -# -# Add dependencies to config/dependencies.rb -# -# dependency "haml", ">=2.2.0" -# dependency "merb-haml", merb_gems_version -# dependency "chriseppstein-compass", :require_as => 'compass' -# -# -# To use a different sass stylesheets locations as is recommended by compass -# add this configuration to your configuration block: -# -# Merb::BootLoader.before_app_loads do -# Merb::Plugins.config[:compass] = { -# :stylesheets => "app/stylesheets", -# :compiled_stylesheets => "public/stylesheets/compiled" -# } -# end -# -module Compass - def self.setup_template_location - # default the compass configuration if they didn't set it up yet. - Merb::Plugins.config[:compass] ||= {} - - # default sass stylesheet location unless configured to something else - Merb::Plugins.config[:compass][:stylesheets] ||= Merb.dir_for(:stylesheet) / "sass" - - # default sass css location unless configured to something else - Merb::Plugins.config[:compass][:compiled_stylesheets] ||= Merb.dir_for(:stylesheet) - - #define the template hash for the project stylesheets as well as the framework stylesheets. - template_location = { - Merb::Plugins.config[:compass][:stylesheets] => Merb::Plugins.config[:compass][:compiled_stylesheets] - } - Compass::Frameworks::ALL.each do |framework| - template_location[framework.stylesheets_directory] = Merb::Plugins.config[:compass][:compiled_stylesheets] - end - - # merge existing template locations if present - if Merb::Plugins.config[:sass][:template_location].is_a?(Hash) - template_location.merge!(Merb::Plugins.config[:sass][:template_location]) - Merb::Plugins.config[:sass][:template_location] = template_location - end - - #configure Sass to know about all these sass locations. - Sass::Plugin.options[:template_location] = template_location - end -end - -Merb::BootLoader.after_app_loads do - #set up sass if haml load didn't do it -- this happens when using a non-default stylesheet location. - unless defined?(Sass::Plugin) - require "sass/plugin" - if Merb::Plugins.config[:sass] - Sass::Plugin.options = Merb::Plugins.config[:sass] - # support old (deprecatd Merb::Config[:sass] option) - elsif Merb::Config[:sass] - Sass::Plugin.options = Merb::Config[:sass] - end - end - - Compass.setup_template_location -end From 1f1f4e28324cf398c3fc2332a00b0a6c2d95edc5 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Wed, 4 Jan 2012 13:01:03 -0800 Subject: [PATCH 223/290] Fix a gemspec issue. --- compass.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compass.gemspec b/compass.gemspec index d6c1194e..0265175c 100644 --- a/compass.gemspec +++ b/compass.gemspec @@ -3,7 +3,8 @@ require File.join(path, 'compass/version') Gem::Specification.new do |gemspec| gemspec.name = "compass" - gemspec.version = Compass::VERSION # Update the VERSION.yml file to set this. + gemspec.date = Date.today + gemspec.version = Compass::VERSION # Update VERSION.yml file to set this. gemspec.description = "Compass is a Sass-based Stylesheet Framework that streamlines the creation and maintainance of CSS." gemspec.homepage = "http://compass-style.org" gemspec.authors = ["Chris Eppstein", "Eric A. Meyer", "Brandon Mathis", "Nico Hagenburger", "Scott Davis"] From 2bd1775d7197c8080b348f1d8f7af00d7293c8eb Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Thu, 5 Jan 2012 08:50:42 -0800 Subject: [PATCH 224/290] Version bump --- VERSION.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.yml b/VERSION.yml index 0ffe9867..efa69d5f 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,5 +2,5 @@ :major: 0 :minor: 12 :state: alpha -:build: 3 +:build: 4 :name: Alnilam From 7c8c0164b840567319abfff74949a0e5aca8a76c Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 6 Jan 2012 14:05:34 -0500 Subject: [PATCH 225/290] nuked merb --- lib/compass/app_integration.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index ed650b32..14785b6a 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -1,6 +1,4 @@ -%w(stand_alone merb).each do |lib| - require "compass/app_integration/#{lib}" -end +require "compass/app_integration/stand_alone" module Compass module AppIntegration From bffba483754cb9381fa51efd8e2a1f0482a21ac6 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Fri, 6 Jan 2012 14:21:05 -0500 Subject: [PATCH 226/290] fixed rouge puts --- lib/compass/commands/update_project.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/compass/commands/update_project.rb b/lib/compass/commands/update_project.rb index 66098d34..0d8f5505 100644 --- a/lib/compass/commands/update_project.rb +++ b/lib/compass/commands/update_project.rb @@ -67,7 +67,6 @@ module Compass if options.include?(:debug_info) && options[:debug_info] compiler_opts[:sass][:debug_info] = options.delete(:debug_info) end - puts compiler_opts.inspect compiler_opts end From df6524ef42ba058b437ce74b10512d262f6468ce Mon Sep 17 00:00:00 2001 From: Ryan Frederick Date: Mon, 9 Jan 2012 23:51:38 -0800 Subject: [PATCH 227/290] =?UTF-8?q?Fix=20typo=20in=20=E2=80=A6help/turoria?= =?UTF-8?q?ls/contributing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc-src/content/help/tutorials/contributing.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/help/tutorials/contributing.markdown b/doc-src/content/help/tutorials/contributing.markdown index 05cb1e4a..9e40ff6a 100644 --- a/doc-src/content/help/tutorials/contributing.markdown +++ b/doc-src/content/help/tutorials/contributing.markdown @@ -10,7 +10,7 @@ Contributing Stylesheets to Compass Thank you for your interest in contributing to Compass. Our goal is to make it as easy as we can for you to contribute changes to compass -- So if there's something here that -seems harder than it aught to be, please let us know. +seems harder than it ought to be, please let us know. If you find a bug **in this document**, you are bound to contribute a fix. Stop reading now if you do not wish to abide by this rule. From 233ec887ebc16d944616a560a8d7ecaaa42ba70f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 11 Jan 2012 23:24:00 -0500 Subject: [PATCH 228/290] compass command is now bundler aware --- bin/compass | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/compass b/bin/compass index d4de4cd4..7eef5c77 100755 --- a/bin/compass +++ b/bin/compass @@ -21,6 +21,10 @@ fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do require 'compass/exec' end +if defined?(Bundler) + Bundler.require :default, :assets +end + runner = Proc.new do Compass::Exec::SubCommandUI.new(ARGV).run! end From 8c84869b0b6bc5396e264fea15c71d4e346ac5d0 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Wed, 18 Jan 2012 20:02:00 -0500 Subject: [PATCH 229/290] fixed tests --- .../fixtures/stylesheets/compass/css/background-clip.css | 9 +++++++-- .../stylesheets/compass/sass/background-clip.scss | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/test/fixtures/stylesheets/compass/css/background-clip.css b/test/fixtures/stylesheets/compass/css/background-clip.css index 683b7e12..45c9574d 100644 --- a/test/fixtures/stylesheets/compass/css/background-clip.css +++ b/test/fixtures/stylesheets/compass/css/background-clip.css @@ -1,5 +1,10 @@ .background-clip { - -moz-background-clip: border; -webkit-background-clip: border; - -khtml-background-clip: border-box; + -moz-background-clip: border; background-clip: border-box; } + +.background-clip-khtml { + -webkit-background-clip: border; + -moz-background-clip: border; + -khtml-background-clip: border-box; + background-clip: border-box; } \ No newline at end of file diff --git a/test/fixtures/stylesheets/compass/sass/background-clip.scss b/test/fixtures/stylesheets/compass/sass/background-clip.scss index 0716dabd..03fd4cc6 100644 --- a/test/fixtures/stylesheets/compass/sass/background-clip.scss +++ b/test/fixtures/stylesheets/compass/sass/background-clip.scss @@ -1,3 +1,8 @@ @import "compass/css3/background-clip"; -.background-clip { @include background-clip('border-box'); } \ No newline at end of file +.background-clip { @include background-clip('border-box'); } + +.background-clip-khtml { + $experimental-support-for-khtml:true; + @include background-clip('border-box'); +} \ No newline at end of file From 5948a7e38af73e3d37d2a90291231128fe2d0bc4 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 28 Jan 2012 15:40:51 -0500 Subject: [PATCH 230/290] dont require defaults only assets group --- bin/compass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/compass b/bin/compass index 7eef5c77..b7e7e012 100755 --- a/bin/compass +++ b/bin/compass @@ -22,7 +22,7 @@ fallback_load_path(File.join(File.dirname(__FILE__), '..', 'lib')) do end if defined?(Bundler) - Bundler.require :default, :assets + Bundler.require :assets end runner = Proc.new do From fc41c452b8142a12c4562949d961fb92b90a6769 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 9 Jan 2012 17:16:47 -0800 Subject: [PATCH 231/290] Don't set the quiet option unless disable_warnings is passed via the nested :sass options hash. --- lib/compass/compiler.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index 345adb50..18fb7a4c 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -12,6 +12,7 @@ module Compass sass_opts = options.delete(:sass) || {} self.options = options self.sass_options = options.dup + self.sass_options.delete(:quiet) self.sass_options.update(sass_opts) self.sass_options[:cache_location] ||= determine_cache_location self.sass_options[:importer] = self.importer = Sass::Importers::Filesystem.new(from) From 7d87a2eee861e55bede9e10e048ab7e70aa6586f Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 28 Jan 2012 20:56:56 -0500 Subject: [PATCH 232/290] strip .css from file names w/ test --- lib/compass/compiler.rb | 2 +- test/units/compiler_test.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/units/compiler_test.rb diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index 345adb50..3e028f9c 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -36,7 +36,7 @@ module Compass def stylesheet_name(sass_file) if sass_file.index(from) == 0 - sass_file[(from.length + 1)..-6] + sass_file[(from.length + 1)..-6].sub(/\.css$/,'') else raise Compass::Error, "You must compile individual stylesheets from the project directory." end diff --git a/test/units/compiler_test.rb b/test/units/compiler_test.rb new file mode 100644 index 00000000..8e2fe604 --- /dev/null +++ b/test/units/compiler_test.rb @@ -0,0 +1,11 @@ +require 'test_helper' +require 'fileutils' + +class CompilerTest < Test::Unit::TestCase + + it "should strip css from file name and reappend" do + compiler = Compass::Compiler.new(Dir.pwd, 'foo', 'bar', {}) + assert_equal 'screen', compiler.stylesheet_name(File.join(Dir.pwd, 'foo', 'screen.css.scss')) + end + +end \ No newline at end of file From c3b0f0117a1849b186899fc309a438b0e50dc546 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sat, 28 Jan 2012 20:57:30 -0500 Subject: [PATCH 233/290] remove todo comment --- lib/compass/configuration/helpers.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index 4abc6204..2b2ec778 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -93,15 +93,6 @@ module Compass options = args.last.is_a?(Hash) ? args.pop : {} configuration_file_path = args.shift || detect_configuration_file - # TODO make this better i don't think it belongs here but it gets the job done - # This will allow compass to boot rails and load the config if its configured in the application.rb file via railtie - # if File.exists?(projectize('config/boot.rb')) && configuration_file_path.nil? - # require 'rails' - # require projectize('config/application.rb') - # options[:project_type] = :rails - # end - - raise ArgumentError, "Too many arguments" if args.any? if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults])) if data.raw_project_type From d642ae7b74134aaaa47231d059b62b991b241668 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 29 Jan 2012 08:05:58 -0800 Subject: [PATCH 234/290] Changelog for rc.0 and a blog post. --- doc-src/content/CHANGELOG.markdown | 14 +++++- ...-29-compass-and-rails-integration.markdown | 49 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 doc-src/content/posts/2012-01-29-compass-and-rails-integration.markdown diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 6159736d..be37bd9c 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,13 +14,23 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.alpha.3 (UNRELEASED) +0.12.rc.0 (UNRELEASED) ------------------------- +### Stylesheet Changes + * Removed -ms prefix from box-sizing * Added sprite_names sass function * Added -ms prefix to transitions -* Added support for `--debug-info` and `--no-debug-info` to compass compile + +### Command Line + +* Added support for `--debug-info` and `--no-debug-info` to the compass compile command + +### Rails Integration + +Rails projects must now use the [`compass-rails`](https://github.com/compass/compass-rails) +gem to integrate with compass. Please read the [README](https://github.com/Compass/compass-rails/blob/master/README.md) for upgrade instructions. More information in this [blog post](/blog/2012/01/29/compass-and-rails-integration/). 0.12.alpha.3 (12/23/2011) ------------------------- diff --git a/doc-src/content/posts/2012-01-29-compass-and-rails-integration.markdown b/doc-src/content/posts/2012-01-29-compass-and-rails-integration.markdown new file mode 100644 index 00000000..8a60529d --- /dev/null +++ b/doc-src/content/posts/2012-01-29-compass-and-rails-integration.markdown @@ -0,0 +1,49 @@ +--- +title: "Compass/Rails Integration in v0.12" +description: "Starting in Compass v0.12 compass's rails integration is +done via a new project called compass-rails." +author: chris +--- + +The Compass v0.12 release is way behind schedule but it's finally getting +very close to release. The main goal of the v0.12 release has been to add +support for the rails asset pipeline and we hope that you'll agree that this +release achieves the very best integration with rails that compass has +ever provided. + +In v0.12, we've create a new gem called `compass-rails` to provide full +support for rails 2.3 and greater. Let me tell you, this was no small +feat. 2.3 lacks Railtie support and 3.1 introduced the asset pipeline. +Backflips were performed; blood, sweat, and tears were shed; Monkeys +were patched and Ducks were punched. + +The compass command line tool will now be aware of and compass +configuration settings you've made in your rails configuration files +and/or in the compass configuration file. You can use the approach that +best suites your workflow. + +While the asset pipeline is convenient, large applications with lots of +stylesheets and many imports can become sluggish in development mode. To +make things snappier, you can now run the compass watcher in a separate +terminal to begin compilation as soon as you save. In combination with +tools like [live-reload](https://github.com/mockko/livereload), you may +not even need to reload your webpage to see the result in your browser. + +Compass extensions and their starter files can be added to your rails +project following the extensions' existing installation instructions. +No special consideration is needed to support rails except to note +that the extension gem should be listed in the `:assets` group of your +Gemfile and you might need to use `bundle exec` to launch the compass +command line tool. + +Having a dedicated gem for integration provides a number of benefits. +First, it means that we can release rails integration fixes on a +separate release schedule from the main compass library. Second, it +solves a chicken & egg problem we had where the command-line tools +didn't know whether they were dealing with a rails project until it was +too late. Finally, it allowed us to clean up some of the Compass +internals. To be clear, this gem doesn't mean that Rails support is +deprecated or a second class citizen in any way. + +Huge thanks go to [Scott Davis](https://github.com/scottdavis) for his +hard work on the compass-rails gem. From a6c045785df1fb83e54e7b13007a768e18329c15 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 29 Jan 2012 13:06:57 -0800 Subject: [PATCH 235/290] Allow some config attributes that are arrays to be inherited properly from inherited config data. --- lib/compass/commands/project_structure.rb | 93 +++++++++++++++ lib/compass/configuration.rb | 7 +- lib/compass/configuration/data.rb | 12 +- lib/compass/configuration/inheritance.rb | 97 +++++++++++++++ lib/compass/configuration/serialization.rb | 24 ++-- test/units/configuration_test.rb | 132 +++++++++++++++++++++ 6 files changed, 354 insertions(+), 11 deletions(-) create mode 100644 lib/compass/commands/project_structure.rb diff --git a/lib/compass/commands/project_structure.rb b/lib/compass/commands/project_structure.rb new file mode 100644 index 00000000..8fdc887a --- /dev/null +++ b/lib/compass/commands/project_structure.rb @@ -0,0 +1,93 @@ +require 'compass/commands/project_base' +require 'compass/commands/update_project' + +module Compass + module Commands + module StructureOptionsParser + def set_options(opts) + opts.banner = %Q{ + Usage: compass structure [path/to/project] [options] + + Description: + Display the import structure of your stylesheets. + + Options: + }.strip.split("\n").map{|l| l.gsub(/^ {0,10}/,'')}.join("\n") + + super + end + end + class ProjectStats < UpdateProject + + register :structure + + def initialize(working_path, options) + super + assert_project_directory_exists! + end + + def perform + @compiler = new_compiler_instance + (options[:sass_files] || sorted_sass_files).each do |sass_file| + print_tree(Compass.projectize(sass_file)) + end + end + + def print_tree(file, depth = 0, importer = @compiler.importer) + puts ((depth > 0 ? "| " : " ") * depth) + "+- " + Compass.deprojectize(file) + @compiler.staleness_checker.send(:compute_dependencies, file, importer).each do |(dep, dep_importer)| + print_tree(dep, depth + 1, dep_importer)# unless Compass.deprojectize(dep)[0...1] == "/" + end + end + + def sorted_sass_files + sass_files = @compiler.sass_files + sass_files.map! do |s| + filename = Compass.deprojectize(s, File.join(Compass.configuration.project_path, Compass.configuration.sass_dir)) + [s, File.dirname(filename), File.basename(filename)] + end + sass_files = sass_files.sort_by do |s,d,f| + File.join(d, f[0] == ?_ ? f[1..-1] : f) + end + sass_files.map!{|s,d,f| s} + end + + class << self + + def option_parser(arguments) + parser = Compass::Exec::CommandOptionParser.new(arguments) + parser.extend(Compass::Exec::GlobalOptionsParser) + parser.extend(Compass::Exec::ProjectOptionsParser) + parser.extend(StructureOptionsParser) + end + + def usage + option_parser([]).to_s + end + + def description(command) + "Report statistics about your stylesheets" + end + + def primary; false; end + + def parse!(arguments) + parser = option_parser(arguments) + parser.parse! + parse_arguments!(parser, arguments) + parser.options + end + + def parse_arguments!(parser, arguments) + if arguments.size > 0 + parser.options[:project_name] = arguments.shift if File.directory?(arguments.first) + parser.options[:sass_files] = arguments + end + end + + end + + end + end +end + diff --git a/lib/compass/configuration.rb b/lib/compass/configuration.rb index 7ad8291a..79b3b3f2 100644 --- a/lib/compass/configuration.rb +++ b/lib/compass/configuration.rb @@ -25,7 +25,6 @@ module Compass attributes_for_directory(:fonts), attributes_for_directory(:extensions, nil), # Compilation options - :sprite_load_path, :output_style, :environment, :relative_assets, @@ -44,6 +43,12 @@ module Compass :chunky_png_options ].flatten + ARRAY_ATTRIBUTES = [ + :sprite_load_path, + :required_libraries, + :loaded_frameworks, + :framework_path + ] # Registers a new configuration property. # Extensions can use this to add new configuration options to compass. # diff --git a/lib/compass/configuration/data.rb b/lib/compass/configuration/data.rb index 45c9e0c4..30c5e7c2 100644 --- a/lib/compass/configuration/data.rb +++ b/lib/compass/configuration/data.rb @@ -57,10 +57,11 @@ module Compass chained_method :run_stylesheet_error inherited_accessor *ATTRIBUTES - inherited_accessor :required_libraries, :loaded_frameworks, :framework_path #XXX we should make these arrays add up cumulatively. strip_trailing_separator *ATTRIBUTES.select{|a| a.to_s =~ /dir|path/} + inherited_array *ARRAY_ATTRIBUTES + def initialize(name, attr_hash = nil) raise "I need a name!" unless name @name = name @@ -91,7 +92,9 @@ module Compass # The block will be passed the root-relative url of the asset. # When called without a block, returns the block that was previously set. def asset_host(&block) + @set_attributes ||= {} if block_given? + @set_attributes[:asset_host] = true @asset_host = block else if @asset_host @@ -116,16 +119,19 @@ module Compass # # asset_cache_buster :none def asset_cache_buster(simple = nil, &block) + @set_attributes ||= {} if block_given? + @set_attributes[:asset_cache_buster] = true @asset_cache_buster = block elsif !simple.nil? if simple == :none + @set_attributes[:asset_cache_buster] = true @asset_cache_buster = Proc.new {|_,_| nil} else raise ArgumentError, "Unexpected argument: #{simple.inspect}" end else - if @asset_cache_buster + if set?(:asset_cache_buster) @asset_cache_buster elsif inherited_data.respond_to?(:asset_cache_buster) inherited_data.asset_cache_buster @@ -173,7 +179,7 @@ module Compass private def assert_valid_keys!(attr_hash) - illegal_attrs = attr_hash.keys - ATTRIBUTES + illegal_attrs = attr_hash.keys - ATTRIBUTES - ARRAY_ATTRIBUTES if illegal_attrs.size == 1 raise Error, "#{illegal_attrs.first.inspect} is not a valid configuration attribute." elsif illegal_attrs.size > 0 diff --git a/lib/compass/configuration/inheritance.rb b/lib/compass/configuration/inheritance.rb index d9a33862..40c6f7dc 100644 --- a/lib/compass/configuration/inheritance.rb +++ b/lib/compass/configuration/inheritance.rb @@ -61,6 +61,97 @@ module Compass inherited_writer(*attributes) end + class ArrayProxy + def initialize(data, attr) + @data, @attr = data, attr + end + def to_ary + @data.send(:"read_inherited_#{@attr}_array") + end + def to_a + to_ary + end + def <<(v) + @data.send(:"add_to_#{@attr}", v) + end + def >>(v) + @data.send(:"remove_from_#{@attr}", v) + end + def serialize_to_config(prop) + if v = @data.raw(prop) + "#{prop} = #{v.inspect}" + else + s = "" + if added = @data.instance_variable_get("@added_to_#{@attr}") + added.each do |a| + s << "#{prop} << #{a.inspect}\n" + end + end + if removed = @data.instance_variable_get("@removed_from_#{@attr}") + removed.each do |r| + s << "#{prop} >> #{r.inspect}\n" + end + end + if s[-1..-1] == "\n" + s[0..-2] + else + s + end + end + end + def method_missing(m, *args, &block) + a = to_ary + if a.respond_to?(m) + a.send(m,*args, &block) + else + super + end + end + end + + def inherited_array(*attributes) + inherited_reader(*attributes) + inherited_writer(*attributes) + attributes.each do |attr| + line = __LINE__ + 1 + class_eval %Q{ + def #{attr} # def sprite_load_paths + ArrayProxy.new(self, #{attr.inspect}) # ArrayProxy.new(self, :sprite_load_paths) + end # end + def #{attr}=(value) # def sprite_load_paths=(value) + @set_attributes ||= {} # @set_attributes ||= {} + @set_attributes[#{attr.inspect}] = true # @set_attributes[:sprite_load_paths] = true + @#{attr} = Array(value) # @sprite_load_paths = Array(value) + @added_to_#{attr} = [] # @added_to_sprite_load_paths = [] + @removed_from_#{attr} = [] # @removed_from_sprite_load_paths = [] + end # end + def read_inherited_#{attr}_array # def read_inherited_sprite_load_paths_array + if #{attr}_set? # if sprite_load_paths_set? + @#{attr} # Array(@#{attr}) + else # else + value = Array(read(#{attr.inspect})) # value = Array(read(:sprite_load_paths)) + value -= Array(@removed_from_#{attr}) # value -= Array(@removed_from_sprite_load_paths) + Array(@added_to_#{attr}) + value # Array(@added_to_sprite_load_paths) + value + end # end + end # end + def add_to_#{attr}(v) # def add_to_sprite_load_paths(v) + if #{attr}_set? # if sprite_load_paths_set? + raw_#{attr} << v # raw_sprite_load_paths << v + else # else + (@added_to_#{attr} ||= []) << v # (@added_to_sprite_load_paths ||= []) << v + end # end + end # end + def remove_from_#{attr}(v) # def remove_from_sprite_load_paths(v) + if #{attr}_set? # if sprite_load_paths_set? + raw_#{attr}.reject!{|e| e == v} # raw_sprite_load_path.reject!{|e| e == v}s + else # else + (@removed_from_#{attr} ||= []) << v # (@removed_from_sprite_load_paths ||= []) << v + end # end + end # end + }, __FILE__, line + end + end + def chained_method(method) line = __LINE__ + 1 class_eval %Q{ @@ -146,6 +237,12 @@ module Compass end end + # Reads the raw value that was set on this object. + # you generally should call raw_() instead. + def raw(attribute) + instance_variable_get("@#{attribute}") + end + # Read a value that is either inherited or set on this instance, if we get to the bottom-most configuration instance, # we ask for the default starting at the top level. def read(attribute) diff --git a/lib/compass/configuration/serialization.rb b/lib/compass/configuration/serialization.rb index bf7a5288..21c9e479 100644 --- a/lib/compass/configuration/serialization.rb +++ b/lib/compass/configuration/serialization.rb @@ -16,13 +16,19 @@ module Compass end end + def get_binding + binding + end def parse_string(contents, filename) - bind = binding + bind = get_binding eval(contents, bind, filename) - ATTRIBUTES.each do |prop| - value = eval(prop.to_s, bind) rescue nil - value = value.to_s if value.is_a?(Pathname) - self.send("#{prop}=", value) unless value.nil? + local_vars_set = eval("local_variables", bind) + local_vars_set.each do |local_var| + if (ATTRIBUTES+ARRAY_ATTRIBUTES).include?(local_var) + value = eval(local_var.to_s, bind) + value = value.to_s if value.is_a?(Pathname) + self.send("#{local_var}=", value) + end end if @added_import_paths self.additional_import_paths ||= [] @@ -45,7 +51,7 @@ module Compass end contents << "# Require any additional compass plugins here.\n" contents << "\n" if (required_libraries || []).any? - ATTRIBUTES.each do |prop| + (ATTRIBUTES + ARRAY_ATTRIBUTES).each do |prop| value = send("#{prop}_without_default") if value.is_a?(Proc) $stderr.puts "WARNING: #{prop} is code and cannot be written to a file. You'll need to copy it yourself." @@ -64,7 +70,11 @@ module Compass end def serialize_property(prop, value) - %Q(#{prop} = #{value.inspect}\n) + if value.respond_to?(:serialize_to_config) + value.serialize_to_config(prop) + "\n" + else + %Q(#{prop} = #{value.inspect}\n) + end end def issue_deprecation_warnings diff --git a/test/units/configuration_test.rb b/test/units/configuration_test.rb index 0ee31575..e471073b 100644 --- a/test/units/configuration_test.rb +++ b/test/units/configuration_test.rb @@ -68,6 +68,84 @@ class ConfigurationTest < Test::Unit::TestCase assert_equal "WARNING: asset_host is code and cannot be written to a file. You'll need to copy it yourself.\n", warning end + class TestData < Compass::Configuration::Data + def initialize + super(:test) + end + inherited_array :stuff + end + + def test_inherited_array_can_clobber + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff = [:b] + data2.inherit_from!(data1) + assert_equal [:b], data2.stuff.to_a + end + + def test_inherited_array_can_append + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff << :b + data2.inherit_from!(data1) + assert_equal [:b, :a], data2.stuff.to_a + end + + def test_inherited_array_can_remove + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff >> :a + data2.inherit_from!(data1) + assert_equal [], data2.stuff.to_a + end + + def test_inherited_array_combined_augmentations + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff >> :a + data2.stuff << :b + data2.inherit_from!(data1) + assert_equal [:b], data2.stuff.to_a + end + + def test_inherited_array_long_methods + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.remove_from_stuff(:a) + data2.add_to_stuff(:b) + data2.inherit_from!(data1) + assert_equal [:b], data2.stuff.to_a + end + + def test_inherited_array_augmentations_can_be_clobbered + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff >> :a + data2.stuff << :b + data2.stuff = [:c] + data2.inherit_from!(data1) + assert_equal [:c], data2.stuff.to_a + end + + def test_inherited_array_augmentations_after_clobbering + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff >> :a + data2.stuff << :b + data2.stuff = [:c, :d] + data2.stuff << :e + data2.stuff >> :c + data2.inherit_from!(data1) + assert_equal [:d, :e], data2.stuff.to_a + end + def test_serialization_warns_with_asset_cache_buster_set contents = StringIO.new(<<-CONFIG) asset_cache_buster do |path| @@ -77,12 +155,36 @@ class ConfigurationTest < Test::Unit::TestCase Compass.add_configuration(contents, "test_serialization_warns_with_asset_cache_buster_set") + assert_kind_of Proc, Compass.configuration.asset_cache_buster_without_default + assert_equal "http://example.com", Compass.configuration.asset_cache_buster_without_default.call("whatever") warning = capture_warning do Compass.configuration.serialize end assert_equal "WARNING: asset_cache_buster is code and cannot be written to a file. You'll need to copy it yourself.\n", warning end + def test_inherited_arrays_augmentations_serialize + inherited = TestData.new + inherited.stuff << :a + d = TestData.new + d.stuff << :b + d.stuff >> :c + assert_equal <> :c +CONFIG + end + def test_inherited_arrays_clobbering_with_augmentations_serialize + inherited = TestData.new + inherited.stuff << :a + d = TestData.new + d.stuff << :b + d.stuff = [:c, :d] + d.stuff << :e + assert_equal < Date: Mon, 30 Jan 2012 19:22:26 -0500 Subject: [PATCH 236/290] failing test for weird data inheritance bug --- test/units/configuration_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/units/configuration_test.rb b/test/units/configuration_test.rb index e471073b..c383aec8 100644 --- a/test/units/configuration_test.rb +++ b/test/units/configuration_test.rb @@ -93,6 +93,18 @@ class ConfigurationTest < Test::Unit::TestCase assert_equal [:b, :a], data2.stuff.to_a end + def test_inherited_array_can_append_2 + data1 = TestData.new + data1.stuff = [:a] + data2 = TestData.new + data2.stuff << :b + data2.inherit_from!(data1) + data3 = TestData.new + data3.stuff << :c + data3.inherit_from!(data2) + assert_equal [:c, :b, :a], data3.stuff.to_a + end + def test_inherited_array_can_remove data1 = TestData.new data1.stuff = [:a] From e4681e267203a136882004da6dc78a9156681e29 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 30 Jan 2012 19:59:31 -0500 Subject: [PATCH 237/290] fixed weird bug with data inheritance --- lib/compass/configuration/inheritance.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/compass/configuration/inheritance.rb b/lib/compass/configuration/inheritance.rb index 40c6f7dc..bbc62253 100644 --- a/lib/compass/configuration/inheritance.rb +++ b/lib/compass/configuration/inheritance.rb @@ -129,7 +129,11 @@ module Compass if #{attr}_set? # if sprite_load_paths_set? @#{attr} # Array(@#{attr}) else # else - value = Array(read(#{attr.inspect})) # value = Array(read(:sprite_load_paths)) + value = if inherited_data # value = Array(read(:sprite_load_paths)) + Array(inherited_data.#{attr}) + else + Array(read(#{attr.inspect})) + end value -= Array(@removed_from_#{attr}) # value -= Array(@removed_from_sprite_load_paths) Array(@added_to_#{attr}) + value # Array(@added_to_sprite_load_paths) + value end # end From ee1adf9535c6b66bab0cfce7eaa954d6cb1ca317 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 30 Jan 2012 18:50:33 -0800 Subject: [PATCH 238/290] Update the madlib for compass 0.12 and compass-rails. --- doc-src/assets/javascripts/install.js | 48 ++++++++++++++++++++++----- doc-src/content/install.haml | 11 +++--- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/doc-src/assets/javascripts/install.js b/doc-src/assets/javascripts/install.js index 6b52b844..31f371de 100644 --- a/doc-src/assets/javascripts/install.js +++ b/doc-src/assets/javascripts/install.js @@ -4,15 +4,38 @@ function showInstallCommand() { var notes = []; var project_name = "<myproject>"; var can_be_bare = true; - commands.push("$ gem install compass"); + var in_working_dir = false; + var use_bundler = false; + if ($("#app-type").val() != "rails") { + commands.push("$ gem install compass"); + } if (cmd == "init") { commands.push("$ cd " + project_name); + in_working_dir = true project_name = "."; + $(".creating").hide(); + } else { + $(".creating").show(); + if ($("#project_name").val() != "") + project_name = $("#project_name").val(); + } + if ($("#app-type").val() == "rails") { + notes.push("

Rails 2.3 and 3.0 users require additional installation steps. For full rails installation and upgrade instructions please refer to the compass-rails README.

"); + use_bundler = true; } if ($("#app-type").val() == "rails") { if (cmd == "create") { commands.push("$ rails new " + project_name); + commands.push("$ cd " + project_name); + in_working_dir = true + project_name = "."; } + commands.push("> Edit Gemfile and add this:"); + commands.push(" group :assets do"); + commands.push(" gem 'compass-rails'"); + commands.push(" # Add any compass extensions here"); + commands.push(" end"); + commands.push("$ bundle"); cmd = "init rails"; can_be_bare = false; } else if ($("#app-type").val() == "other") { @@ -28,9 +51,12 @@ function showInstallCommand() { var framework = $("#framework").val(); var create_command; if (cmd == "install") { - create_command = "$ compass install " + framework + " " + project_name; + create_command = "$ compass install " + framework; } else { - create_command = "$ compass " + cmd + " " + project_name; + create_command = "$ compass " + cmd; + } + if (!in_working_dir) { + create_command = create_command + " " + project_name; } if (framework != "compass" && framework != "bare" && cmd != "install") { create_command = create_command + " --using " + framework; @@ -46,14 +72,20 @@ function showInstallCommand() { } if ($("#options").val() == "customized") { $("#directories").show(); - create_command = create_command + - " --sass-dir \"" + $("#sassdir").val() + "\"" + - " --css-dir \"" + $("#cssdir").val() + "\"" + - " --javascripts-dir \"" + $("#jsdir").val() + "\"" + - " --images-dir \"" + $("#imagesdir").val() + "\""; + if ($("#sassdir").val() != "") + create_command += " --sass-dir \"" + $("#sassdir").val() + "\""; + if ($("#cssdir").val() != "") + create_command += " --css-dir \"" + $("#cssdir").val() + "\""; + if ($("#jsdir").val() != "") + create_command += " --javascripts-dir \"" + $("#jsdir").val() + "\""; + if ($("#imagesdir").val() != "") + create_command += " --images-dir \"" + $("#imagesdir").val() + "\""; } else { $("#directories").hide(); } + if (use_bundler) { + create_command = "$ bundle exec " + create_command.replace(/\$ /,''); + } commands.push(create_command); var instructions = "
" + commands.join("\n") + "
"; if (instructions.match(/</)) { diff --git a/doc-src/content/install.haml b/doc-src/content/install.haml index 440868aa..bde59961 100644 --- a/doc-src/content/install.haml +++ b/doc-src/content/install.haml @@ -30,6 +30,9 @@ body_id: install %option{:value => "rails"} rails %option{:value => "other"} other project + %span.creating + named + %input#project_name(placeholder="") with %select#framework %option{:value => "compass"} compass's @@ -48,14 +51,14 @@ body_id: install %option{:value => "customized"} customize my project's directory structure. %h4 Thanks. Now run the following steps in your terminal: From 11cf736066afcfbd005d7073101685fdf7cd11cd Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 30 Jan 2012 22:11:34 -0500 Subject: [PATCH 239/290] fixed bug where application integrations would not load if there was a config file --- lib/compass/app_integration.rb | 10 +++++++++- lib/compass/configuration/helpers.rb | 8 +++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index 14785b6a..640aebcd 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -3,7 +3,7 @@ require "compass/app_integration/stand_alone" module Compass module AppIntegration module Helpers - attr_accessor :project_types + #attr_accessor :project_types DEAFULT_PROJECT_TYPES = { :stand_alone => "Compass::AppIntegration::StandAlone" } @@ -12,6 +12,14 @@ module Compass @project_types ||= DEAFULT_PROJECT_TYPES end + def project_types + @project_types + end + + def any? + @project_types == DEAFULT_PROJECT_TYPES + end + def lookup(type) unless @project_types[type].nil? eval @project_types[type] diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index 2b2ec778..f253c3e2 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -92,7 +92,7 @@ module Compass def add_project_configuration(*args) options = args.last.is_a?(Hash) ? args.pop : {} configuration_file_path = args.shift || detect_configuration_file - + raise ArgumentError, "Too many arguments" if args.any? if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults])) if data.raw_project_type @@ -103,9 +103,11 @@ module Compass add_configuration(:stand_alone) end - add_configuration(data) + unless AppIntegration.any? + add_configuration(data) + end else - add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone) + add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone) end end From 7198a6990915b2b66cc87432df112867cc1baa59 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 30 Jan 2012 22:12:01 -0500 Subject: [PATCH 240/290] sprite importer will now error if it does not find the associated glob --- lib/compass/errors.rb | 1 + lib/compass/sass_extensions/sprites.rb | 1 - lib/compass/sprite_importer.rb | 3 +++ test/units/sprites/sprite_command_test.rb | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/compass/errors.rb b/lib/compass/errors.rb index 96695e34..de2ec60f 100644 --- a/lib/compass/errors.rb +++ b/lib/compass/errors.rb @@ -7,4 +7,5 @@ module Compass class MissingDependency < Error end + class SpriteException < Error; end end diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb index 5047c74a..277bfa94 100644 --- a/lib/compass/sass_extensions/sprites.rb +++ b/lib/compass/sass_extensions/sprites.rb @@ -2,7 +2,6 @@ require 'digest/md5' require 'compass/sprite_importer' module Compass - class SpriteException < Exception; end module SassExtensions module Sprites end diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 8af0ea0c..670f9323 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -79,6 +79,9 @@ module Compass next if files.empty? return files end + + path = Compass.configuration.sprite_load_path.to_a.join(', ') + raise Compass::SpriteException, %Q{No files were found in the load path matching "#{uri}". Your current load paths are: #{path}} end # Returns an Array of image names without the file extension diff --git a/test/units/sprites/sprite_command_test.rb b/test/units/sprites/sprite_command_test.rb index b1242b66..12a86786 100644 --- a/test/units/sprites/sprite_command_test.rb +++ b/test/units/sprites/sprite_command_test.rb @@ -47,7 +47,7 @@ class SpriteCommandTest < Test::Unit::TestCase end it "should create sprite file" do - assert_equal 0, run_compass_with_options(['sprite', "-f", 'stylesheet.scss', "'#{@images_tmp_path}/*.png'"]).to_i + assert_equal 0, run_compass_with_options(['sprite', "-f", 'stylesheet.scss', "squares/*.png"]).to_i assert File.exists?(File.join(test_dir, 'stylesheet.scss')) end From f11e5a3205059caeb8edab524dfbb6c7529ebcbf Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Mon, 30 Jan 2012 22:32:05 -0500 Subject: [PATCH 241/290] refactored the previous change --- lib/compass/app_integration.rb | 6 +++--- lib/compass/configuration/helpers.rb | 10 +++++----- test/units/sprites/sprite_command_test.rb | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/compass/app_integration.rb b/lib/compass/app_integration.rb index 640aebcd..2439984d 100644 --- a/lib/compass/app_integration.rb +++ b/lib/compass/app_integration.rb @@ -9,15 +9,15 @@ module Compass } def init - @project_types ||= DEAFULT_PROJECT_TYPES + @project_types ||= DEAFULT_PROJECT_TYPES.dup end def project_types @project_types end - def any? - @project_types == DEAFULT_PROJECT_TYPES + def default? + @project_types.keys === DEAFULT_PROJECT_TYPES.keys end def lookup(type) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index f253c3e2..33071fc8 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -94,7 +94,7 @@ module Compass configuration_file_path = args.shift || detect_configuration_file raise ArgumentError, "Too many arguments" if args.any? - if data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults])) + if AppIntegration.default? && data = configuration_for(configuration_file_path, nil, configuration_for(options[:defaults])) if data.raw_project_type add_configuration(data.raw_project_type.to_sym) elsif options[:project_type] @@ -102,10 +102,10 @@ module Compass else add_configuration(:stand_alone) end - - unless AppIntegration.any? - add_configuration(data) - end + + + add_configuration(data) + else add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone) end diff --git a/test/units/sprites/sprite_command_test.rb b/test/units/sprites/sprite_command_test.rb index 12a86786..8b262079 100644 --- a/test/units/sprites/sprite_command_test.rb +++ b/test/units/sprites/sprite_command_test.rb @@ -11,7 +11,8 @@ class SpriteCommandTest < Test::Unit::TestCase @before_dir = ::Dir.pwd create_temp_cli_dir create_sprite_temp - File.open(File.join(@test_dir, 'config.rb'), 'w') do |f| + @config_file = File.join(@test_dir, 'config.rb') + File.open(@config_file, 'w') do |f| f << config_data end end From ff51850b90bb57a8e2d795fdeb92180af0757548 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Mon, 16 Jan 2012 19:27:27 +0100 Subject: [PATCH 242/290] Flush stdout buffer to make sure the stdout message show up correctly. --- lib/compass/commands/watch_project.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/compass/commands/watch_project.rb b/lib/compass/commands/watch_project.rb index 0246aca9..68e697b6 100644 --- a/lib/compass/commands/watch_project.rb +++ b/lib/compass/commands/watch_project.rb @@ -81,6 +81,7 @@ module Compass action = FSSM::Backends::Default.to_s == "FSSM::Backends::Polling" ? "polling" : "watching" puts ">>> Compass is #{action} for changes. Press Ctrl-C to Stop." + $stdout.flush begin FSSM.monitor do |monitor| @@ -100,14 +101,17 @@ module Compass path.glob glob path.update do |base, relative| puts ">>> Change detected to: #{relative}" + $stdout.flush callback.call(base, relative) end path.create do |base, relative| puts ">>> New file detected: #{relative}" + $stdout.flush callback.call(base, relative) end path.delete do |base, relative| puts ">>> File Removed: #{relative}" + $stdout.flush callback.call(base, relative) end end @@ -139,6 +143,7 @@ module Compass if file = compiler.out_of_date? begin puts ">>> Change detected to: #{relative || compiler.relative_stylesheet_name(file)}" + $stdout.flush compiler.run GC.start rescue StandardError => e From cef86e2bbc246593a776548537a10eb819c0f884 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 30 Jan 2012 21:26:57 -0800 Subject: [PATCH 243/290] Account for the fact that ruby 1.8 returns strings from the local_variables method. --- lib/compass/configuration/serialization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/configuration/serialization.rb b/lib/compass/configuration/serialization.rb index 21c9e479..b7a9bfcf 100644 --- a/lib/compass/configuration/serialization.rb +++ b/lib/compass/configuration/serialization.rb @@ -24,7 +24,7 @@ module Compass eval(contents, bind, filename) local_vars_set = eval("local_variables", bind) local_vars_set.each do |local_var| - if (ATTRIBUTES+ARRAY_ATTRIBUTES).include?(local_var) + if (ATTRIBUTES+ARRAY_ATTRIBUTES).include?(local_var.to_sym) value = eval(local_var.to_s, bind) value = value.to_s if value.is_a?(Pathname) self.send("#{local_var}=", value) From 0e74efb13e17b2c10fcbc9113d383787b0dbb965 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 04:03:22 -0500 Subject: [PATCH 244/290] change version --- VERSION.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.yml b/VERSION.yml index efa69d5f..03342c2f 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -1,6 +1,6 @@ --- :major: 0 :minor: 12 -:state: alpha +:state: rc :build: 4 :name: Alnilam From 3d4ddca76a03b53a9ecf65b3b15513c6b418f07d Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 04:12:36 -0500 Subject: [PATCH 245/290] strip nils --- lib/compass/sass_extensions/sprites/image.rb | 2 +- lib/compass/sprite_importer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/image.rb b/lib/compass/sass_extensions/sprites/image.rb index 3bd7e0d6..4ee6a186 100644 --- a/lib/compass/sass_extensions/sprites/image.rb +++ b/lib/compass/sass_extensions/sprites/image.rb @@ -26,7 +26,7 @@ module Compass end def find_file - Compass.configuration.sprite_load_path.each do |path| + Compass.configuration.sprite_load_path.compact.each do |path| f = File.join(path, relative_file) if File.exists?(f) return f diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb index 670f9323..c1b9cdc0 100644 --- a/lib/compass/sprite_importer.rb +++ b/lib/compass/sprite_importer.rb @@ -74,7 +74,7 @@ module Compass # Returns the Glob of image files for the uri def self.files(uri) - Compass.configuration.sprite_load_path.each do |folder| + Compass.configuration.sprite_load_path.compact.each do |folder| files = Dir[File.join(folder, uri)].sort next if files.empty? return files From 144ae4f67255d1715f8629320fd34583843a4d89 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 31 Jan 2012 08:02:46 -0800 Subject: [PATCH 246/290] Compass 0.12 blog post --- doc-src/content/CHANGELOG.markdown | 2 +- ...12-02-01-compass-0-12-is-released.markdown | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 doc-src/content/posts/2012-02-01-compass-0-12-is-released.markdown diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index be37bd9c..f98bd948 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -70,7 +70,7 @@ gem to integrate with compass. Please read the [README](https://github.com/Compa * Changed the descriptions of the sin, cos, and tan to be more descriptive * Fixed trig functions via issue #498 * Fixed the default `http_path` in rails -* Sprites can now have a `sprite_search_path` that is an array of directories that +* Sprites can now have a `sprite_load_path` that is an array of directories that contain source images for sprites handy for using sprites in extensions or gems * Added a new set of configuration properties for generated images. `generated_images_dir`, `generated_images_path`, `http_generated_images_dir`, diff --git a/doc-src/content/posts/2012-02-01-compass-0-12-is-released.markdown b/doc-src/content/posts/2012-02-01-compass-0-12-is-released.markdown new file mode 100644 index 00000000..b16fd828 --- /dev/null +++ b/doc-src/content/posts/2012-02-01-compass-0-12-is-released.markdown @@ -0,0 +1,47 @@ +--- +title: "Compass v0.12 (Release Candidate) is Released" +description: "Compass 0.12: Flexible Sprites, Rails Integration" +author: chris +--- + +Compass 0.12 release candidate is out! Install it now: + + $ (sudo) gem install compass --pre + +This release is primarily to support the Rails Asset Pipeline which +required major changes to the Compass internals. If you use rails +with Compass please read the [blog post about the new compass-rails +gem][compass-rails]. + +In addition to the rails improvements this release contains many updates +to Compass Sprites: + +* **Sprite Layouts**: `vertical` (default), `horizontal`, `diagonal`, and `smart` + layouts are now available. Different layouts may allow you to use + sprites more easily with differing design requirements. The `smart` + layout will efficiently pack sprites of different sizes -- resulting + in smaller file sizes. To select a layout set the + `$-layout` variable to your desired layout name. +* **Sprite Load Path**: Sprite source files can now be stored in more locations than + just your images directory. To add sprite locations in your compass + configuration: `sprite_load_path << 'my/sprite/folder' +* **Sprite output location**: If you need to output sprites to a + location other than the images directory set `generated_images_dir`, + `generated_images_path`, `http_generated_images_dir`, and + `http_generated_images_path` in your compass configuration according + to your needs. You can refer to images in your generated images + directory using the `generated-image-url()` function. + +Additionally there are many new CSS3 improvements, bug fixes, and other +small enhancements that you can read about in the +[CHANGELOG](/CHANGELOG/). + +What's next for Compass? The Sass 3.2 release is coming soon and I'd +very much like the 0.13 release of compass to take advantage of the +great features that it offers. Additionally, we're working on an +extension registry where you can post your compass extensions and +discover new ones. Lastly, we'll be extracting blueprint to a +compass extension as that project seems to have stagnated. I'd say +we're getting pretty close to a 1.0 release! + +[compass-rails]: /blog/2012/01/29/compass-and-rails-integration/ From 5cd413667693dc7f4948066319017f0c9aed66a3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 11:29:39 -0500 Subject: [PATCH 247/290] fixed problem with path and ree/1.8.7 in test case --- test/test_helper.rb | 4 ++-- test/units/sprites/sprite_command_test.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index cb8ce6d3..b2cedcd4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -46,8 +46,8 @@ module SpriteHelper URI = "selectors/*.png" def init_sprite_helper - @images_src_path = File.join(File.dirname(__FILE__), 'fixtures', 'sprites', 'public', 'images') - @images_tmp_path = File.join(File.dirname(__FILE__), 'fixtures', 'sprites', 'public', 'images-tmp') + @images_src_path = File.join(File.expand_path('../', __FILE__), 'fixtures', 'sprites', 'public', 'images') + @images_tmp_path = File.join(File.expand_path('../', __FILE__), 'fixtures', 'sprites', 'public', 'images-tmp') end def sprite_map_test(options, uri = URI) diff --git a/test/units/sprites/sprite_command_test.rb b/test/units/sprites/sprite_command_test.rb index 8b262079..2c30c168 100644 --- a/test/units/sprites/sprite_command_test.rb +++ b/test/units/sprites/sprite_command_test.rb @@ -19,7 +19,7 @@ class SpriteCommandTest < Test::Unit::TestCase def config_data return <<-CONFIG - images_path = #{@images_tmp_path.inspect} + images_path = "#{@images_tmp_path}" CONFIG end From fedc4fa47c2b95d13dc89e32490c115fe2b9b358 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 11:58:50 -0500 Subject: [PATCH 248/290] fixed version --- VERSION.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.yml b/VERSION.yml index 03342c2f..117c6d22 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,5 +2,5 @@ :major: 0 :minor: 12 :state: rc -:build: 4 +:build: 0 :name: Alnilam From 050e45d2fce22a28e6bf592718d07a0874719277 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Tue, 31 Jan 2012 08:53:44 -0800 Subject: [PATCH 249/290] Add img to the inline-block display type for elements-of-type(). --- lib/compass/sass_extensions/functions/display.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compass/sass_extensions/functions/display.rb b/lib/compass/sass_extensions/functions/display.rb index 48f95ec9..104fea5e 100644 --- a/lib/compass/sass_extensions/functions/display.rb +++ b/lib/compass/sass_extensions/functions/display.rb @@ -7,6 +7,7 @@ module Compass::SassExtensions::Functions::Display datalist dfn em embed font i img input keygen kbd label mark meter output progress q rp rt ruby s samp select small span strike strong sub sup textarea time tt u var video wbr}, + :"inline-block" => %w{img}, :table => %w{table}, :"list-item" => %w{li}, :"table-row-group" => %w{tbody}, From ea677274a482febb0f41fdc18555bbfe4588e797 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 12:05:52 -0500 Subject: [PATCH 250/290] rogue quote --- lib/compass/commands/watch_project.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/compass/commands/watch_project.rb b/lib/compass/commands/watch_project.rb index 1ea458ff..554ffd27 100644 --- a/lib/compass/commands/watch_project.rb +++ b/lib/compass/commands/watch_project.rb @@ -142,7 +142,8 @@ module Compass compiler = new_compiler_instance(:quiet => true, :loud => [:identical, :overwrite, :create]) if file = compiler.out_of_date? begin - puts ">>> Change detected at "+Time.now.strftime("%T")+" to: #{relative || compiler.relative_stylesheet_name(file)} + puts ">>> Change detected at "+Time.now.strftime("%T")+" to: #{relative || compiler.relative_stylesheet_name(file)}" + $stdout.flush compiler.run GC.start rescue StandardError => e From 2c423997253be0e2ec4cb9101e4da7d0c3628b53 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Tue, 31 Jan 2012 12:07:38 -0500 Subject: [PATCH 251/290] fixed test --- test/fixtures/stylesheets/compass/css/fonts.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/stylesheets/compass/css/fonts.css b/test/fixtures/stylesheets/compass/css/fonts.css index c282458a..3fbbfb55 100644 --- a/test/fixtures/stylesheets/compass/css/fonts.css +++ b/test/fixtures/stylesheets/compass/css/fonts.css @@ -1,4 +1,4 @@ @font-face { font-family: "font1"; src: url('/tmp/fonts/font1.eot'); - src: url('/tmp/fonts/font1.eot?iefix') format('eot'), url('/tmp/fonts/font1.woff') format('woff'); } + src: url('/tmp/fonts/font1.eot?#iefix') format('eot'), url('/tmp/fonts/font1.woff') format('woff'); } From 87e57cf6ead2b2517fc27aa3722c0d8d0241a32e Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Thu, 2 Feb 2012 13:59:20 -0800 Subject: [PATCH 252/290] Upgrade notifications for compass rails users to use the compass-rails gem. --- lib/compass.rb | 3 +++ lib/compass/app_integration/rails.rb | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 lib/compass/app_integration/rails.rb diff --git a/lib/compass.rb b/lib/compass.rb index 081b0538..97ec92b7 100644 --- a/lib/compass.rb +++ b/lib/compass.rb @@ -30,3 +30,6 @@ end %w(configuration frameworks app_integration actions compiler).each do |lib| require "compass/#{lib}" end + +# for rails upgrade warnings in 0.12 +require 'compass/app_integration/rails' diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb new file mode 100644 index 00000000..9b64f4be --- /dev/null +++ b/lib/compass/app_integration/rails.rb @@ -0,0 +1,18 @@ +module Compass + module AppIntegration + module Rails + extend self + def initialize! + Compass::Util.compass_warn("WARNING: Please remove the call to Compass::AppIntegration::Rails.initialize! from #{caller[0].sub(/:.*$/,'')};\nWARNING: This is done automatically now. If this is default compass initializer you can just remove the file.") + end + def root + Compass::Util.compass_warn("WARNING: Please remove the call to Compass::AppIntegration::Rails.root from #{caller[0].sub(/:.*$/,'')};\nWARNING: This is done automatically now. If this is default compass initializer you can just remove the file.") + ::Rails.root + end + def env + Compass::Util.compass_warn("WARNING: Please remove the call to Compass::AppIntegration::Rails.env from #{caller[0].sub(/:.*$/,'')};\nWARNING: This is done automatically now. If this is default compass initializer you can just remove the file.") + ::Rails.env + end + end + end +end From 99c1d372d7319fd0ef98a934a46b2a0ddd110cd0 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 2 Feb 2012 17:29:11 -0500 Subject: [PATCH 253/290] version bump --- VERSION.yml | 2 +- doc-src/Gemfile.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/VERSION.yml b/VERSION.yml index 117c6d22..a56ccbb4 100644 --- a/VERSION.yml +++ b/VERSION.yml @@ -2,5 +2,5 @@ :major: 0 :minor: 12 :state: rc -:build: 0 +:build: 1 :name: Alnilam diff --git a/doc-src/Gemfile.lock b/doc-src/Gemfile.lock index 3c071171..a761d11c 100644 --- a/doc-src/Gemfile.lock +++ b/doc-src/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: .. specs: - compass (0.12.alpha.1.1cd0c41) + compass (0.12.rc.0.c403ac9) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.1) @@ -9,9 +9,9 @@ PATH PATH remote: ../../compass-theme specs: - compass-theme (0.0.1) + compass-theme (0.0.2) compass (~> 0.11) - compass-susy-plugin (>= 0.7.0.pre8) + compass-susy-plugin (~> 0.7.0) css-slideshow (= 0.2.0) GEM @@ -23,13 +23,13 @@ GEM builder (3.0.0) chunky_png (1.2.5) coderay (0.9.7) - compass-susy-plugin (0.9.beta.3) - compass (>= 0.11.beta.3) + compass-susy-plugin (0.7.0) + compass (>= 0.10.0) cri (2.0.2) css-slideshow (0.2.0) compass (>= 0.10.0.rc3) css_parser (1.0.1) - fssm (0.2.7) + fssm (0.2.8.1) haml (3.1.2) i18n (0.4.2) json (1.5.4) @@ -42,7 +42,7 @@ GEM rb-fsevent (0.4.0) rdiscount (1.6.8) ruby-prof (0.10.8) - sass (3.1.10) + sass (3.1.12) serve (1.0.0) activesupport (~> 3.0.1) i18n (~> 0.4.1) From 6cca0c48529d9a0ca0e2ef624cb028742834c237 Mon Sep 17 00:00:00 2001 From: Hampton Catlin Date: Mon, 6 Feb 2012 13:52:06 -0800 Subject: [PATCH 254/290] small documentation change to 3d transforms. referenced here: http://css3.bradshawenterprises.com/support/ --- .../compass/stylesheets/compass/css3/_transform.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transform.scss b/frameworks/compass/stylesheets/compass/css3/_transform.scss index ceb18271..93cc9d96 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transform.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transform.scss @@ -2,14 +2,14 @@ // @doc off // Note ---------------------------------------------------------------------- -// Safari is the only browser that currently supports 3D transforms. -// Because of that it can be important to control whether a given 2D transform -// uses the full range of experimental browser prefixes, or only the 3D list. +// Safari, Chrome, and Firefox all support 3D transforms. However, +// only in the most recent builds. You should also provide fallback 2d support for +// Opera and IE. IE10 is slated to have 3d enabled, but is currently unreleased. // To make that easy, all 2D transforms include an browser-targeting toggle ($only3d) // to switch between the two support lists. The toggle defaults to 'false' (2D), // and also accepts 'true' (3D). Currently the lists are as follows: // 2D: Mozilla, Webkit, Opera, Official -// 3D: Webkit, Official **(Only Safari Supports 3D perspective)** +// 3D: Webkit, Firefox. // Available Transforms ------------------------------------------------------ // - Scale (2d and 3d) From 234304d713e926e612dc35169672c7f1636aa1b1 Mon Sep 17 00:00:00 2001 From: Xananax Date: Thu, 9 Feb 2012 15:28:04 +0200 Subject: [PATCH 255/290] updated sprite tests to reflect property background to background-image change --- test/integrations/sprites_test.rb | 94 +++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 3284f995..6f375a99 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -67,7 +67,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sbbc18e2129.png') no-repeat; + background-image: url('/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -98,7 +99,8 @@ class SpritesTest < Test::Unit::TestCase assert_not_nil Dir.glob("#{@generated_images_tmp_path}/squares-s*.png").first assert_correct <<-CSS, css .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/images/generated/squares-sbbc18e2129.png') no-repeat; + background-image: url('/images/generated/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -119,7 +121,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sbbc18e2129.png') no-repeat; + background-image: url('/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -151,7 +154,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .cubicle, .large-cube { - background: url('/squares-sbbc18e2129.png') no-repeat; + background-image: url('/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } .cubicle { @@ -176,7 +180,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .circles { - background: url('/squares-sbbc18e2129.png') no-repeat; + background-image: url('/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } CSS assert_equal image_size('squares-s*.png'), [20, 30] @@ -190,7 +195,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s563a5e0855.png') no-repeat; + background-image: url('/squares-s563a5e0855.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -212,7 +218,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s4ea353fa6d.png') no-repeat; + background-image: url('/squares-s4ea353fa6d.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -235,7 +242,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sf4771cb124.png') no-repeat; + background-image: url('/squares-sf4771cb124.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -258,7 +266,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sc82d6f3cf4.png') no-repeat; + background-image: url('/squares-sc82d6f3cf4.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -280,7 +289,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s2f4aa65dcf.png') no-repeat; + background-image: url('/squares-s2f4aa65dcf.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -298,7 +308,8 @@ class SpritesTest < Test::Unit::TestCase css = render <<-SCSS $squares: sprite-map("squares/*.png", $position: 100%); .squares-sprite { - background: $squares no-repeat; + background-image: $squares; + background-repeat: no-repeat; } .adjusted-percentage { @@ -315,7 +326,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite { - background: url('/squares-sce5dc30797.png') no-repeat; + background-image: url('/squares-sce5dc30797.png'); + background-repeat: no-repeat; } .adjusted-percentage { @@ -353,7 +365,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .adjusted-percentage, .adjusted-px-1, .adjusted-px-2 { - background: url('/squares-sce5dc30797.png') no-repeat; + background-image: url('/squares-sce5dc30797.png'); + background-repeat: no-repeat; } .adjusted-percentage { @@ -380,7 +393,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-s65c43cd573.png') no-repeat; + background-image: url('/squares-s65c43cd573.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -404,7 +418,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-sb9d9a8ca6a.png') no-repeat; + background-image: url('/squares-sb9d9a8ca6a.png'); + background-repeat: no-repeat; } .squares-ten-by-ten { @@ -423,14 +438,16 @@ class SpritesTest < Test::Unit::TestCase assert_raise(Sass::SyntaxError) do render <<-SCSS .squares { - background: sprite-url("squares/*.png") no-repeat; + background-image: sprite-url("squares/*.png"); + background-repeat: no-repeat; } SCSS end assert_raise(Sass::SyntaxError) do css = render <<-SCSS .squares { - background: sprite-image("squares/twenty-by-twenty.png") no-repeat; + background-image: sprite-image("squares/twenty-by-twenty.png"); + background-repeat: no-repeat; } SCSS end @@ -439,7 +456,8 @@ class SpritesTest < Test::Unit::TestCase @import "squares/*.png"; .squares { - background: sprite-position("squares/twenty-by-twenty.png") no-repeat; + background-image: sprite-position("squares/twenty-by-twenty.png"); + background-repeat: no-repeat; } SCSS end @@ -448,12 +466,15 @@ class SpritesTest < Test::Unit::TestCase it "should work even if @import is missing" do css = render <<-SCSS .squares { - background: sprite(sprite-map("squares/*.png"), twenty-by-twenty) no-repeat; + background-image: sprite(sprite-map("squares/*.png"), twenty-by-twenty); + background-repeat: no-repeat; } SCSS assert_correct css, <<-CSS .squares { - background: url('/squares-sd817b59156.png') 0 -10px no-repeat; + background-image: url('/squares-sd817b59156.png'); + background-position: 0 -10px; + background-repeat: no-repeat; } CSS end @@ -472,7 +493,8 @@ class SpritesTest < Test::Unit::TestCase assert_equal image_size('squares-s*.png'), [20, 40] assert_correct css, <<-CSS .squares-sprite { - background: url('/squares-s555875d730.png') no-repeat; + background-image: url('/squares-s555875d730.png'); + background-repeat: no-repeat; } .foo { @@ -492,7 +514,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-s7e84acb3d2.png') no-repeat; + background-image: url('/selectors-s7e84acb3d2.png'); + background-repeat: no-repeat; } .selectors-ten-by-ten { @@ -517,7 +540,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-s7e84acb3d2.png') no-repeat; + background-image: url('/selectors-s7e84acb3d2.png'); + background-repeat: no-repeat; } .selectors-ten-by-ten { @@ -544,7 +568,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-s7e84acb3d2.png') no-repeat; + background-image: url('/selectors-s7e84acb3d2.png'); + background-repeat: no-repeat; } a { @@ -573,7 +598,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-s7e84acb3d2.png') no-repeat; + background-image: url('/selectors-s7e84acb3d2.png') + background-repeat: no-repeat; } a { @@ -591,7 +617,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background: url('/selectors-s7e84acb3d2.png') no-repeat; + background-image: url('/selectors-s7e84acb3d2.png') + background-repeat: no-repeat; } a { @@ -628,7 +655,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .ko-sprite, .ko-default_background, .ko-starbg26x27 { - background: url('/ko-sd46dfbab4f.png') no-repeat; + background-image: url('/ko-sd46dfbab4f.png') + background-repeat: no-repeat; } .ko-default_background { @@ -699,7 +727,8 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .nested-sprite, .nested-ten-by-ten { - background: url('/nested-s7b93e0b6bf.png') no-repeat; + background-image: url('/nested-s7b93e0b6bf.png'); + background-repeat: no-repeat; } .nested-ten-by-ten { @@ -722,7 +751,8 @@ class SpritesTest < Test::Unit::TestCase assert_equal [30, 20], image_size('squares-s*.png') other_css = <<-CSS .squares-sprite { - background: url('/squares-s4bd95c5c56.png') no-repeat; + background-image: url('/squares-s4bd95c5c56.png'); + background-repeat: no-repeat; } .foo { @@ -748,7 +778,8 @@ class SpritesTest < Test::Unit::TestCase SCSS other_css = <<-CSS .squares-sprite { - background: url('/squares-sbbc18e2129.png') no-repeat; + background-image: url('/squares-sbbc18e2129.png'); + background-repeat: no-repeat; } .div { height:21px; @@ -770,7 +801,8 @@ class SpritesTest < Test::Unit::TestCase SCSS other_css = <<-CSS .colors-sprite { - background:url('/colors-s58671cb5bb.png') no-repeat; + background-image:url('/colors-s58671cb5bb.png'); + background-repeat: no-repeat; } .blue { text-indent:-119988px; From 205f059adbcdefe54d915c60adfec8834746c5d7 Mon Sep 17 00:00:00 2001 From: Xananax Date: Thu, 9 Feb 2012 15:29:52 +0200 Subject: [PATCH 256/290] Changed the background property into background-image property in order to allow one to set a background-color; previously, background-color was overriden by the background style. Also added background-repeat property. --- lib/compass/sprite_importer/content.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb index ccc6144e..bff7e745 100644 --- a/lib/compass/sprite_importer/content.erb +++ b/lib/compass/sprite_importer/content.erb @@ -42,7 +42,8 @@ $<%= name %>-inline: false !default; } } @else { #{$<%= name %>-sprite-base-class} { - background: $<%= name %>-sprites no-repeat; + background-image: $<%= name %>-sprites; + background-repeat: no-repeat; } } //sass functions to return the dimensions of a sprite image as units @@ -78,4 +79,4 @@ $<%= name %>-inline: false !default; // Generates a class for each sprited image. @mixin all-<%= name %>-sprites($dimensions: $<%= name %>-sprite-dimensions, $prefix: sprite-map-name($<%= name %>-sprites), $offset-x: 0, $offset-y: 0) { @include <%= name %>-sprites(<%= sprite_names.join(" ") %>, $dimensions, $prefix, $offset-x, $offset-y); -} \ No newline at end of file +} From bbdb179df1571e1dae5abdf9bcacadaf99e5d8a3 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 9 Feb 2012 19:50:20 -0500 Subject: [PATCH 257/290] Revert "Merge pull request #712 from Xananax/sprite_background_image" This reverts commit 0c208d58faf4d184b37a0aa020d17e4d774e4c79, reversing changes made to c81af69c69976e02f383b9b9e2820d120549e155. --- lib/compass/sprite_importer/content.erb | 5 +- test/integrations/sprites_test.rb | 94 ++++++++----------------- 2 files changed, 33 insertions(+), 66 deletions(-) diff --git a/lib/compass/sprite_importer/content.erb b/lib/compass/sprite_importer/content.erb index bff7e745..ccc6144e 100644 --- a/lib/compass/sprite_importer/content.erb +++ b/lib/compass/sprite_importer/content.erb @@ -42,8 +42,7 @@ $<%= name %>-inline: false !default; } } @else { #{$<%= name %>-sprite-base-class} { - background-image: $<%= name %>-sprites; - background-repeat: no-repeat; + background: $<%= name %>-sprites no-repeat; } } //sass functions to return the dimensions of a sprite image as units @@ -79,4 +78,4 @@ $<%= name %>-inline: false !default; // Generates a class for each sprited image. @mixin all-<%= name %>-sprites($dimensions: $<%= name %>-sprite-dimensions, $prefix: sprite-map-name($<%= name %>-sprites), $offset-x: 0, $offset-y: 0) { @include <%= name %>-sprites(<%= sprite_names.join(" ") %>, $dimensions, $prefix, $offset-x, $offset-y); -} +} \ No newline at end of file diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 6f375a99..3284f995 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -67,8 +67,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -99,8 +98,7 @@ class SpritesTest < Test::Unit::TestCase assert_not_nil Dir.glob("#{@generated_images_tmp_path}/squares-s*.png").first assert_correct <<-CSS, css .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/images/generated/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/images/generated/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -121,8 +119,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .squares-ten-by-ten { @@ -154,8 +151,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .cubicle, .large-cube { - background-image: url('/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .cubicle { @@ -180,8 +176,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .circles { - background-image: url('/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } CSS assert_equal image_size('squares-s*.png'), [20, 30] @@ -195,8 +190,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-s563a5e0855.png'); - background-repeat: no-repeat; + background: url('/squares-s563a5e0855.png') no-repeat; } .squares-ten-by-ten { @@ -218,8 +212,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-s4ea353fa6d.png'); - background-repeat: no-repeat; + background: url('/squares-s4ea353fa6d.png') no-repeat; } .squares-ten-by-ten { @@ -242,8 +235,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-sf4771cb124.png'); - background-repeat: no-repeat; + background: url('/squares-sf4771cb124.png') no-repeat; } .squares-ten-by-ten { @@ -266,8 +258,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-sc82d6f3cf4.png'); - background-repeat: no-repeat; + background: url('/squares-sc82d6f3cf4.png') no-repeat; } .squares-ten-by-ten { @@ -289,8 +280,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-s2f4aa65dcf.png'); - background-repeat: no-repeat; + background: url('/squares-s2f4aa65dcf.png') no-repeat; } .squares-ten-by-ten { @@ -308,8 +298,7 @@ class SpritesTest < Test::Unit::TestCase css = render <<-SCSS $squares: sprite-map("squares/*.png", $position: 100%); .squares-sprite { - background-image: $squares; - background-repeat: no-repeat; + background: $squares no-repeat; } .adjusted-percentage { @@ -326,8 +315,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite { - background-image: url('/squares-sce5dc30797.png'); - background-repeat: no-repeat; + background: url('/squares-sce5dc30797.png') no-repeat; } .adjusted-percentage { @@ -365,8 +353,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .adjusted-percentage, .adjusted-px-1, .adjusted-px-2 { - background-image: url('/squares-sce5dc30797.png'); - background-repeat: no-repeat; + background: url('/squares-sce5dc30797.png') no-repeat; } .adjusted-percentage { @@ -393,8 +380,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-s65c43cd573.png'); - background-repeat: no-repeat; + background: url('/squares-s65c43cd573.png') no-repeat; } .squares-ten-by-ten { @@ -418,8 +404,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background-image: url('/squares-sb9d9a8ca6a.png'); - background-repeat: no-repeat; + background: url('/squares-sb9d9a8ca6a.png') no-repeat; } .squares-ten-by-ten { @@ -438,16 +423,14 @@ class SpritesTest < Test::Unit::TestCase assert_raise(Sass::SyntaxError) do render <<-SCSS .squares { - background-image: sprite-url("squares/*.png"); - background-repeat: no-repeat; + background: sprite-url("squares/*.png") no-repeat; } SCSS end assert_raise(Sass::SyntaxError) do css = render <<-SCSS .squares { - background-image: sprite-image("squares/twenty-by-twenty.png"); - background-repeat: no-repeat; + background: sprite-image("squares/twenty-by-twenty.png") no-repeat; } SCSS end @@ -456,8 +439,7 @@ class SpritesTest < Test::Unit::TestCase @import "squares/*.png"; .squares { - background-image: sprite-position("squares/twenty-by-twenty.png"); - background-repeat: no-repeat; + background: sprite-position("squares/twenty-by-twenty.png") no-repeat; } SCSS end @@ -466,15 +448,12 @@ class SpritesTest < Test::Unit::TestCase it "should work even if @import is missing" do css = render <<-SCSS .squares { - background-image: sprite(sprite-map("squares/*.png"), twenty-by-twenty); - background-repeat: no-repeat; + background: sprite(sprite-map("squares/*.png"), twenty-by-twenty) no-repeat; } SCSS assert_correct css, <<-CSS .squares { - background-image: url('/squares-sd817b59156.png'); - background-position: 0 -10px; - background-repeat: no-repeat; + background: url('/squares-sd817b59156.png') 0 -10px no-repeat; } CSS end @@ -493,8 +472,7 @@ class SpritesTest < Test::Unit::TestCase assert_equal image_size('squares-s*.png'), [20, 40] assert_correct css, <<-CSS .squares-sprite { - background-image: url('/squares-s555875d730.png'); - background-repeat: no-repeat; + background: url('/squares-s555875d730.png') no-repeat; } .foo { @@ -514,8 +492,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background-image: url('/selectors-s7e84acb3d2.png'); - background-repeat: no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } .selectors-ten-by-ten { @@ -540,8 +517,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, .selectors-ten-by-ten { - background-image: url('/selectors-s7e84acb3d2.png'); - background-repeat: no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } .selectors-ten-by-ten { @@ -568,8 +544,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background-image: url('/selectors-s7e84acb3d2.png'); - background-repeat: no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -598,8 +573,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background-image: url('/selectors-s7e84acb3d2.png') - background-repeat: no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -617,8 +591,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .selectors-sprite, a { - background-image: url('/selectors-s7e84acb3d2.png') - background-repeat: no-repeat; + background: url('/selectors-s7e84acb3d2.png') no-repeat; } a { @@ -655,8 +628,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .ko-sprite, .ko-default_background, .ko-starbg26x27 { - background-image: url('/ko-sd46dfbab4f.png') - background-repeat: no-repeat; + background: url('/ko-sd46dfbab4f.png') no-repeat; } .ko-default_background { @@ -727,8 +699,7 @@ class SpritesTest < Test::Unit::TestCase SCSS assert_correct css, <<-CSS .nested-sprite, .nested-ten-by-ten { - background-image: url('/nested-s7b93e0b6bf.png'); - background-repeat: no-repeat; + background: url('/nested-s7b93e0b6bf.png') no-repeat; } .nested-ten-by-ten { @@ -751,8 +722,7 @@ class SpritesTest < Test::Unit::TestCase assert_equal [30, 20], image_size('squares-s*.png') other_css = <<-CSS .squares-sprite { - background-image: url('/squares-s4bd95c5c56.png'); - background-repeat: no-repeat; + background: url('/squares-s4bd95c5c56.png') no-repeat; } .foo { @@ -778,8 +748,7 @@ class SpritesTest < Test::Unit::TestCase SCSS other_css = <<-CSS .squares-sprite { - background-image: url('/squares-sbbc18e2129.png'); - background-repeat: no-repeat; + background: url('/squares-sbbc18e2129.png') no-repeat; } .div { height:21px; @@ -801,8 +770,7 @@ class SpritesTest < Test::Unit::TestCase SCSS other_css = <<-CSS .colors-sprite { - background-image:url('/colors-s58671cb5bb.png'); - background-repeat: no-repeat; + background:url('/colors-s58671cb5bb.png') no-repeat; } .blue { text-indent:-119988px; From 75df388aef10d691eec774afbcb01085a283258f Mon Sep 17 00:00:00 2001 From: Nathaniel Higgins Date: Tue, 14 Feb 2012 01:59:28 +0000 Subject: [PATCH 258/290] Fix links in spriting that result in 404s --- doc-src/content/help/tutorials/spriting.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc-src/content/help/tutorials/spriting.markdown b/doc-src/content/help/tutorials/spriting.markdown index 1578ef0c..235777ef 100644 --- a/doc-src/content/help/tutorials/spriting.markdown +++ b/doc-src/content/help/tutorials/spriting.markdown @@ -52,14 +52,14 @@ You can now apply the `icon-XXX` classes to your markup as needed. Let's go over what happened there. The import statement told compass to [generate a stylesheet that is customized for your sprites](https://gist.github.com/729507). This -stylesheet is [magic](/help/tutorials/spriting/magic-imports), it is not written to disk, and it can be customized +stylesheet is [magic](#magic-imports), it is not written to disk, and it can be customized by setting configuration variables before you import it. See the section below on -[Customization Options](/help/tutorials/spriting/customization). The goal of this stylesheet is to provide a +[Customization Options](customization-options). The goal of this stylesheet is to provide a simple naming convention for your sprites so that you they are easy to remember and use. You should never have to care what the is name of the generated sprite map, nor where a sprite is located within it. - + ## Nested Folders ****Note**: The use of `orange` is only for this example, "icon" represents the folder name that contains your sprites. @@ -71,7 +71,7 @@ Example: @import "themes/orange/*.png"; @include all-orange-sprite; - + ## Selector Control ****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. @@ -102,7 +102,7 @@ And your stylesheet will compile to: .actions .save { background-position: 0 -96px; } .actions .delete { background-position: 0 0; } - + ## Sass Functions ****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. @@ -126,7 +126,7 @@ Example: } - + ## Magic Imports ****Note**: The use of `icon` is only for this example, "icon" represents the folder name that contains your sprites. @@ -148,7 +148,7 @@ might want to avoid it. For instance, if your sprite map has more than about 20 sprites, you may find that hand crafting the import will speed up compilation times. See the section on [performance considerations](#performance) for more details. - + ## Performance Considerations Reading PNG files and assembling new images and saving them to disk might have a non-trivial From cf60a909314bccf5fffa1e677fadb98a698e431b Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sat, 18 Feb 2012 11:36:49 -0800 Subject: [PATCH 259/290] Adding support for prefixed transition properties, e.g. transform & transform-origin. Can easily be extended for further properties. --- .../stylesheets/compass/css3/_transition.scss | 84 ++++++++++++++++++- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index d2ee7bb2..ee2cec54 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -23,15 +23,15 @@ $default-transition-function: false !default; $default-transition-delay: false !default; +$transitionable-prefixed-properties: transform, transform-origin !default; + // One or more properties to transition // // * for multiple, use a comma-delimited list // * also accepts "all" or "none" @mixin transition-property($properties: $default-transition-property) { - @include experimental(transition-property, unquote($properties), - -moz, -webkit, -o, -ms, not -khtml, official - ); + @include prefix-friendly-transition(unquote($properties)); } // One or more durations in seconds @@ -126,8 +126,84 @@ $default-transition-delay: false !default; @if $transition-1 == default { $transition-1 : -compass-space-list(compact($default-transition-property, $default-transition-duration, $default-transition-function, $default-transition-delay)); } + $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); + @include prefix-friendly-transition($transition); +} + +@function array-push($array, $object, $comma: false) { + @if $comma { + @if $array { + $array: $array, $object; + } @else { + $array: $object; + } + } @else { + @if $array { + $array: $array $object; + } @else { + $array: $object; + } + } + + @return $array; +} + +@function string-join($existing, $addition) { + @if $existing { + @if $addition { + $existing: $existing $addition; + } + } @else { + $existing: $addition; + } + + @return $existing; +} + +@mixin prefix-friendly-transition($transition) { + $raw-transition: -compass-space-list($transition); + + $webkit-transition: false; + $moz-transition: false; + $ms-transition: false; + $o-transition: false; + + @each $single-transition in $raw-transition { + $property: nth($single-transition, 1); + $match: false; + + @each $prefixed-property in $transitionable-prefixed-properties { + @if $property == $prefixed-property { + $match: true; + } + } + + @if $match { + $single-transition-suffix: false; + + @for $i from 2 through length($single-transition) { + $single-transition-suffix: array-push($single-transition-suffix, nth($single-transition, $i)); + } + + $webkit-transition: array-push($webkit-transition, string-join(-webkit-#{$property}, $single-transition-suffix), true); + $moz-transition: array-push($moz-transition, string-join(-moz-#{$property}, $single-transition-suffix), true); + $ms-transition: array-push($ms-transition, string-join(-ms-#{$property}, $single-transition-suffix), true); + $o-transition: array-push($o-transition, string-join(-o-#{$property}, $single-transition-suffix), true); + } @else { + $webkit-transition: array-push($webkit-transition, $single-transition, true); + $moz-transition: array-push($moz-transition, $single-transition, true); + $ms-transition: array-push($ms-transition, $single-transition, true); + $o-transition: array-push($o-transition, $single-transition, true); + } + } + + -webkit-transition: $webkit-transition; + -moz-transition: $moz-transition; + -ms-transition: $ms-transition; + -o-transition: $o-transition; + @include experimental(transition, $transition, - -moz, -webkit, -o, -ms, not -khtml, official + not -moz, not -webkit, not -o, not -ms, not -khtml, official ); } From 52065da5d4230a79d8d99f3de1ca66bcb02d8891 Mon Sep 17 00:00:00 2001 From: Sunny Ripert Date: Tue, 21 Feb 2012 18:06:05 +0100 Subject: [PATCH 260/290] When @importing "compass/utilities/sprites" also load "sprites/base" --- frameworks/compass/stylesheets/compass/utilities/_sprites.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/compass/stylesheets/compass/utilities/_sprites.scss b/frameworks/compass/stylesheets/compass/utilities/_sprites.scss index 981afaaf..00668048 100644 --- a/frameworks/compass/stylesheets/compass/utilities/_sprites.scss +++ b/frameworks/compass/stylesheets/compass/utilities/_sprites.scss @@ -1 +1,2 @@ +@import "sprites/base"; @import "sprites/sprite-img"; From eec7b438e6f6e4243e3e45d787c0753855433b85 Mon Sep 17 00:00:00 2001 From: Ryan Frederick Date: Sat, 25 Feb 2012 12:30:20 -0800 Subject: [PATCH 261/290] Fix link to partials in docs (help/tutorials/best_practices) --- doc-src/content/help/tutorials/best_practices.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-src/content/help/tutorials/best_practices.markdown b/doc-src/content/help/tutorials/best_practices.markdown index 4c472f7a..a153c343 100644 --- a/doc-src/content/help/tutorials/best_practices.markdown +++ b/doc-src/content/help/tutorials/best_practices.markdown @@ -107,7 +107,7 @@ For instance, don't use `table thead tr th` when a simple `th` selector will suffice. This might mean that you have to separate your styles into several selectors and let the document cascade work to your advantage. -[1]: http://sass-lang.com/yardoc/file.SASS_REFERENCE.html#partials +[1]: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#partials [2]: http://groups.google.com/group/compass-users/browse_frm/thread/0ed216d409476f88 [3]: http://compass-style.org/help/tutorials/configurable-variables/ [4]: http://c2.com/cgi/wiki?DontRepeatYourself From 6a3d024cc1bcef5d13fe39e4c63a62400b1ab936 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 00:55:52 -0800 Subject: [PATCH 262/290] Updated with the following: - Added stylesheet tests for prefixed transition properties. - transition-property mixin now passes all tests. - single-transition mixin now passes all tests. - Updated rewrite to respect user specified browser support. --- .../stylesheets/compass/css3/_transition.scss | 95 ++++++++++++++----- .../stylesheets/compass/css/transition.css | 24 ++++- .../stylesheets/compass/sass/transition.scss | 5 +- 3 files changed, 99 insertions(+), 25 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index ee2cec54..c092e43c 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -31,7 +31,29 @@ $transitionable-prefixed-properties: transform, transform-origin !default; // * also accepts "all" or "none" @mixin transition-property($properties: $default-transition-property) { - @include prefix-friendly-transition(unquote($properties)); + @if type-of($properties) == string { $properties: unquote($properties); } + + $match: false; + + @each $prefixed-property in $transitionable-prefixed-properties { + @if $properties == $prefixed-property { + $match: true; + } + } + + @if $match { + @if $experimental-support-for-webkit { -webkit-transition-property: -webkit-#{$properties}; } + @if $experimental-support-for-mozilla { -moz-transition-property: -moz-#{$properties}; } + @if $experimental-support-for-microsoft { -ms-transition-property: -ms-#{$properties}; } + @if $experimental-support-for-opera { -o-transition-property: -o-#{$properties}; } + @include experimental(transition-property, $properties, + not -moz, not -webkit, not -o, not -ms, not -khtml, official + ); + } @else { + @include experimental(transition-property, $properties, + -moz, -webkit, -o, -ms, not -khtml, official + ); + } } // One or more durations in seconds @@ -78,29 +100,56 @@ $transitionable-prefixed-properties: transform, transform-origin !default; $function: $default-transition-function, $delay: $default-transition-delay ) { + $match: false; + + @each $prefixed-property in $transitionable-prefixed-properties { + @if $property == $prefixed-property { + $match: true; + } + } + @if $property and $duration and $function { // Shorthand (see https://github.com/chriseppstein/compass/issues/585) @if $delay { - -webkit-transition: $property $duration $function; - -webkit-transition-delay: $delay; - @include experimental(transition, $property $duration $function $delay, - -moz, - not -webkit, - -o, - -ms, - not -khtml, - official - ); + @if $match { + @if $experimental-support-for-webkit { -webkit-transition: -webkit-#{$property} $duration $function; -webkit-transition-delay: $delay; } + @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function $delay; } + @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function $delay; } + @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function $delay; } + @include experimental(transition, $property $duration $function $delay, + not -moz, not -webkit, not -o, not -ms, not -khtml, official + ); + } @else { + @if $experimental-support-for-webkit { -webkit-transition: $property $duration $function; -webkit-transition-delay: $delay; } + @include experimental(transition, $property $duration $function $delay, + -moz, + not -webkit, + -o, + -ms, + not -khtml, + official + ); + } } @else { - @include experimental(transition, $property $duration $function, - -moz, - -webkit, - -o, - -ms, - not -khtml, - official - ); + @if $match { + @if $experimental-support-for-webkit { -webkit-transition: -webkit-#{$property} $duration $function; } + @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function; } + @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function; } + @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function; } + @include experimental(transition, $property $duration $function, + not -moz, not -webkit, not -o, not -ms, not -khtml, official + ); + } @else { + @include experimental(transition, $property $duration $function, + -moz, + -webkit, + -o, + -ms, + not -khtml, + official + ); + } } } @else { @@ -198,10 +247,10 @@ $transitionable-prefixed-properties: transform, transform-origin !default; } } - -webkit-transition: $webkit-transition; - -moz-transition: $moz-transition; - -ms-transition: $ms-transition; - -o-transition: $o-transition; + @if $experimental-support-for-webkit { -webkit-transition: $webkit-transition; } + @if $experimental-support-for-mozilla { -moz-transition: $moz-transition; } + @if $experimental-support-for-microsoft { -ms-transition: $ms-transition; } + @if $experimental-support-for-opera { -o-transition: $o-transition; } @include experimental(transition, $transition, not -moz, not -webkit, not -o, not -ms, not -khtml, official diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 1d34c025..c7c939b1 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -25,4 +25,26 @@ -moz-transition-duration: 0.2s, 0.5s, 0.2s; -ms-transition-duration: 0.2s, 0.5s, 0.2s; -o-transition-duration: 0.2s, 0.5s, 0.2s; - transition-duration: 0.2s, 0.5s, 0.2s; } \ No newline at end of file + transition-duration: 0.2s, 0.5s, 0.2s; } + +.single-transform-transition-without-delay { + -webkit-transition: -webkit-transform 0.6s ease-out; + -moz-transition: -moz-transform 0.6s ease-out; + -ms-transition: -ms-transform 0.6s ease-out; + -o-transition: -o-transform 0.6s ease-out; + transition: transform 0.6s ease-out; } + +.single-transform-transition-with-delay { + -webkit-transition: -webkit-transform 0.6s ease-out; + -webkit-transition-delay: 0.2s; + -moz-transition: -moz-transform 0.6s ease-out 0.2s; + -ms-transition: -ms-transform 0.6s ease-out 0.2s; + -o-transition: -o-transform 0.6s ease-out 0.2s; + transition: transform 0.6s ease-out 0.2s; } + +.transition-property { + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -ms-transition-property: -ms-transform; + -o-transition-property: -o-transform; + transition-property: transform; } diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss index 9fa9edde..706ef113 100644 --- a/test/fixtures/stylesheets/compass/sass/transition.scss +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -3,4 +3,7 @@ .single-transition-without-delay { @include single-transition(all, 0.6s, ease-out); } .single-transition-with-delay { @include single-transition(all, 0.6s, ease-out, 0.2s); } .transition-duration-string { @include transition-duration("0.2s, 0.5s, 0.2s"); } -.transition-duration-list { @include transition-duration((0.2s, 0.5s, 0.2s)); } \ No newline at end of file +.transition-duration-list { @include transition-duration((0.2s, 0.5s, 0.2s)); } +.single-transform-transition-without-delay { @include single-transition(transform, 0.6s, ease-out); } +.single-transform-transition-with-delay { @include single-transition(transform, 0.6s, ease-out, 0.2s); } +.transition-property { @include transition-property(transform); } From 388e3a611fd588b56c3f6e31e922e170c5b9c906 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 11:24:49 -0800 Subject: [PATCH 263/290] Using transition property in lieu of @experimental mixin. --- .../stylesheets/compass/css3/_transition.scss | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index c092e43c..6a865049 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -46,9 +46,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @if $experimental-support-for-mozilla { -moz-transition-property: -moz-#{$properties}; } @if $experimental-support-for-microsoft { -ms-transition-property: -ms-#{$properties}; } @if $experimental-support-for-opera { -o-transition-property: -o-#{$properties}; } - @include experimental(transition-property, $properties, - not -moz, not -webkit, not -o, not -ms, not -khtml, official - ); + transition-property: $properties; } @else { @include experimental(transition-property, $properties, -moz, -webkit, -o, -ms, not -khtml, official @@ -116,9 +114,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function $delay; } @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function $delay; } @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function $delay; } - @include experimental(transition, $property $duration $function $delay, - not -moz, not -webkit, not -o, not -ms, not -khtml, official - ); + transition: $property $duration $function $delay; } @else { @if $experimental-support-for-webkit { -webkit-transition: $property $duration $function; -webkit-transition-delay: $delay; } @include experimental(transition, $property $duration $function $delay, @@ -137,9 +133,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function; } @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function; } @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function; } - @include experimental(transition, $property $duration $function, - not -moz, not -webkit, not -o, not -ms, not -khtml, official - ); + transition: $property $duration $function; } @else { @include experimental(transition, $property $duration $function, -moz, @@ -251,8 +245,5 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @if $experimental-support-for-mozilla { -moz-transition: $moz-transition; } @if $experimental-support-for-microsoft { -ms-transition: $ms-transition; } @if $experimental-support-for-opera { -o-transition: $o-transition; } - - @include experimental(transition, $transition, - not -moz, not -webkit, not -o, not -ms, not -khtml, official - ); + transition: $transition; } From 9a40ba9ec3f834871886f253c375af0c03ed4d86 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 11:39:30 -0800 Subject: [PATCH 264/290] transition-property mixin now includes support for multiple prefixed values. --- .../stylesheets/compass/css3/_transition.scss | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index 6a865049..14b3fbe2 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -32,26 +32,40 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @mixin transition-property($properties: $default-transition-property) { @if type-of($properties) == string { $properties: unquote($properties); } + $raw-properties: -compass-space-list($properties); - $match: false; + $webkit-transition-property: false; + $moz-transition-property: false; + $ms-transition-property: false; + $o-transition-property: false; - @each $prefixed-property in $transitionable-prefixed-properties { - @if $properties == $prefixed-property { - $match: true; + @each $property in $raw-properties { + $match: false; + + @each $prefixed-property in $transitionable-prefixed-properties { + @if $property == $prefixed-property { + $match: true; + } + } + + @if $match { + $webkit-transition-property: array-push($webkit-transition-property, -webkit-#{$property}, true); + $moz-transition-property: array-push($moz-transition-property, -moz-#{$property}, true); + $ms-transition-property: array-push($ms-transition-property, -ms-#{$property}, true); + $o-transition-property: array-push($o-transition-property, -o-#{$property}, true); + } @else { + $webkit-transition-property: array-push($webkit-transition-property, $property, true); + $moz-transition-property: array-push($moz-transition-property, $property, true); + $ms-transition-property: array-push($ms-transition-property, $property, true); + $o-transition-property: array-push($o-transition-property, $property, true); } } - @if $match { - @if $experimental-support-for-webkit { -webkit-transition-property: -webkit-#{$properties}; } - @if $experimental-support-for-mozilla { -moz-transition-property: -moz-#{$properties}; } - @if $experimental-support-for-microsoft { -ms-transition-property: -ms-#{$properties}; } - @if $experimental-support-for-opera { -o-transition-property: -o-#{$properties}; } - transition-property: $properties; - } @else { - @include experimental(transition-property, $properties, - -moz, -webkit, -o, -ms, not -khtml, official - ); - } + @if $experimental-support-for-webkit { -webkit-transition-property: $webkit-transition-property; } + @if $experimental-support-for-mozilla { -moz-transition-property: $moz-transition-property; } + @if $experimental-support-for-microsoft { -ms-transition-property: $ms-transition-property; } + @if $experimental-support-for-opera { -o-transition-property: $o-transition-property; } + transition-property: $properties; } // One or more durations in seconds From 3b586059cdb13904e03f0841aca9ef3c4cc28e80 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 11:39:58 -0800 Subject: [PATCH 265/290] Test for multiple transition properties. --- test/fixtures/stylesheets/compass/css/transition.css | 7 +++++++ test/fixtures/stylesheets/compass/sass/transition.scss | 1 + 2 files changed, 8 insertions(+) diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index c7c939b1..dbdb5fe8 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -48,3 +48,10 @@ -ms-transition-property: -ms-transform; -o-transition-property: -o-transform; transition-property: transform; } + +.multiple-transition-properties { + -webkit-transition-property: opacity, -webkit-transform, left; + -moz-transition-property: opacity, -moz-transform, left; + -ms-transition-property: opacity, -ms-transform, left; + -o-transition-property: opacity, -o-transform, left; + transition-property: opacity, transform, left; } diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss index 706ef113..523c1c76 100644 --- a/test/fixtures/stylesheets/compass/sass/transition.scss +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -7,3 +7,4 @@ .single-transform-transition-without-delay { @include single-transition(transform, 0.6s, ease-out); } .single-transform-transition-with-delay { @include single-transition(transform, 0.6s, ease-out, 0.2s); } .transition-property { @include transition-property(transform); } +.multiple-transition-properties { @include transition-property((opacity, transform, left)); } From 4d01676a76da60d2fbd073e26dcd90f80c573cfe Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 11:43:00 -0800 Subject: [PATCH 266/290] Redundant use of a built-in helper function. Removing string-join() for compact(join()). --- .../stylesheets/compass/css3/_transition.scss | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index 14b3fbe2..7dc21e56 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -206,18 +206,6 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @return $array; } -@function string-join($existing, $addition) { - @if $existing { - @if $addition { - $existing: $existing $addition; - } - } @else { - $existing: $addition; - } - - @return $existing; -} - @mixin prefix-friendly-transition($transition) { $raw-transition: -compass-space-list($transition); @@ -243,10 +231,10 @@ $transitionable-prefixed-properties: transform, transform-origin !default; $single-transition-suffix: array-push($single-transition-suffix, nth($single-transition, $i)); } - $webkit-transition: array-push($webkit-transition, string-join(-webkit-#{$property}, $single-transition-suffix), true); - $moz-transition: array-push($moz-transition, string-join(-moz-#{$property}, $single-transition-suffix), true); - $ms-transition: array-push($ms-transition, string-join(-ms-#{$property}, $single-transition-suffix), true); - $o-transition: array-push($o-transition, string-join(-o-#{$property}, $single-transition-suffix), true); + $webkit-transition: array-push($webkit-transition, compact(join(-webkit-#{$property}, $single-transition-suffix)), true); + $moz-transition: array-push($moz-transition, compact(join(-moz-#{$property}, $single-transition-suffix)), true); + $ms-transition: array-push($ms-transition, compact(join(-ms-#{$property}, $single-transition-suffix)), true); + $o-transition: array-push($o-transition, compact(join(-o-#{$property}, $single-transition-suffix)), true); } @else { $webkit-transition: array-push($webkit-transition, $single-transition, true); $moz-transition: array-push($moz-transition, $single-transition, true); From 177fda7460d470e13f91987db4628b855855a8c8 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 11:53:10 -0800 Subject: [PATCH 267/290] Per @chriseppstein: we don't need to use `-compass-space-list` anymore. Sass provides `()` to construct an empty space-delimited list. --- .../compass/stylesheets/compass/css3/_transition.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index 7dc21e56..d1a56213 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -32,7 +32,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @mixin transition-property($properties: $default-transition-property) { @if type-of($properties) == string { $properties: unquote($properties); } - $raw-properties: -compass-space-list($properties); + $raw-properties: ($properties); $webkit-transition-property: false; $moz-transition-property: false; @@ -181,7 +181,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; $transition-10: false ) { @if $transition-1 == default { - $transition-1 : -compass-space-list(compact($default-transition-property, $default-transition-duration, $default-transition-function, $default-transition-delay)); + $transition-1 : (compact($default-transition-property, $default-transition-duration, $default-transition-function, $default-transition-delay)); } $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); @@ -207,7 +207,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; } @mixin prefix-friendly-transition($transition) { - $raw-transition: -compass-space-list($transition); + $raw-transition: ($transition); $webkit-transition: false; $moz-transition: false; From 14a553f0f41efd36e47f89222dae9597d0943882 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 12:27:49 -0800 Subject: [PATCH 268/290] Redundant use of a built-in helper function. Removing array-push() for append(). --- .../stylesheets/compass/css3/_transition.scss | 70 +++++++------------ 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index d1a56213..48ed2f82 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -34,10 +34,10 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @if type-of($properties) == string { $properties: unquote($properties); } $raw-properties: ($properties); - $webkit-transition-property: false; - $moz-transition-property: false; - $ms-transition-property: false; - $o-transition-property: false; + $webkit-transition-property: compact(false); + $moz-transition-property: compact(false); + $ms-transition-property: compact(false); + $o-transition-property: compact(false); @each $property in $raw-properties { $match: false; @@ -49,15 +49,15 @@ $transitionable-prefixed-properties: transform, transform-origin !default; } @if $match { - $webkit-transition-property: array-push($webkit-transition-property, -webkit-#{$property}, true); - $moz-transition-property: array-push($moz-transition-property, -moz-#{$property}, true); - $ms-transition-property: array-push($ms-transition-property, -ms-#{$property}, true); - $o-transition-property: array-push($o-transition-property, -o-#{$property}, true); + $webkit-transition-property: append($webkit-transition-property, -webkit-#{$property}, comma); + $moz-transition-property: append($moz-transition-property, -moz-#{$property}, comma); + $ms-transition-property: append($ms-transition-property, -ms-#{$property}, comma); + $o-transition-property: append($o-transition-property, -o-#{$property}, comma); } @else { - $webkit-transition-property: array-push($webkit-transition-property, $property, true); - $moz-transition-property: array-push($moz-transition-property, $property, true); - $ms-transition-property: array-push($ms-transition-property, $property, true); - $o-transition-property: array-push($o-transition-property, $property, true); + $webkit-transition-property: append($webkit-transition-property, $property, comma); + $moz-transition-property: append($moz-transition-property, $property, comma); + $ms-transition-property: append($ms-transition-property, $property, comma); + $o-transition-property: append($o-transition-property, $property, comma); } } @@ -188,31 +188,13 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @include prefix-friendly-transition($transition); } -@function array-push($array, $object, $comma: false) { - @if $comma { - @if $array { - $array: $array, $object; - } @else { - $array: $object; - } - } @else { - @if $array { - $array: $array $object; - } @else { - $array: $object; - } - } - - @return $array; -} - @mixin prefix-friendly-transition($transition) { $raw-transition: ($transition); - $webkit-transition: false; - $moz-transition: false; - $ms-transition: false; - $o-transition: false; + $webkit-transition: compact(false); + $moz-transition: compact(false); + $ms-transition: compact(false); + $o-transition: compact(false); @each $single-transition in $raw-transition { $property: nth($single-transition, 1); @@ -225,21 +207,21 @@ $transitionable-prefixed-properties: transform, transform-origin !default; } @if $match { - $single-transition-suffix: false; + $single-transition-suffix: compact(false); @for $i from 2 through length($single-transition) { - $single-transition-suffix: array-push($single-transition-suffix, nth($single-transition, $i)); + $single-transition-suffix: append($single-transition-suffix, nth($single-transition, $i), space); } - $webkit-transition: array-push($webkit-transition, compact(join(-webkit-#{$property}, $single-transition-suffix)), true); - $moz-transition: array-push($moz-transition, compact(join(-moz-#{$property}, $single-transition-suffix)), true); - $ms-transition: array-push($ms-transition, compact(join(-ms-#{$property}, $single-transition-suffix)), true); - $o-transition: array-push($o-transition, compact(join(-o-#{$property}, $single-transition-suffix)), true); + $webkit-transition: append($webkit-transition, compact(join(-webkit-#{$property}, $single-transition-suffix)), comma); + $moz-transition: append($moz-transition, compact(join(-moz-#{$property}, $single-transition-suffix)), comma); + $ms-transition: append($ms-transition, compact(join(-ms-#{$property}, $single-transition-suffix)), comma); + $o-transition: append($o-transition, compact(join(-o-#{$property}, $single-transition-suffix)), comma); } @else { - $webkit-transition: array-push($webkit-transition, $single-transition, true); - $moz-transition: array-push($moz-transition, $single-transition, true); - $ms-transition: array-push($ms-transition, $single-transition, true); - $o-transition: array-push($o-transition, $single-transition, true); + $webkit-transition: append($webkit-transition, $single-transition, comma); + $moz-transition: append($moz-transition, $single-transition, comma); + $ms-transition: append($ms-transition, $single-transition, comma); + $o-transition: append($o-transition, $single-transition, comma); } } From 3f23287afb60dc8f79cb2418f618c1cf1621fc42 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 12:28:03 -0800 Subject: [PATCH 269/290] Adding test for multiple transitions. --- test/fixtures/stylesheets/compass/css/transition.css | 7 +++++++ test/fixtures/stylesheets/compass/sass/transition.scss | 1 + 2 files changed, 8 insertions(+) diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index dbdb5fe8..39087d7e 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -42,6 +42,13 @@ -o-transition: -o-transform 0.6s ease-out 0.2s; transition: transform 0.6s ease-out 0.2s; } +.multiple-transitions { + -webkit-transition: -webkit-transform 0.6s ease-out, opacity 0.2s ease-in; + -moz-transition: -moz-transform 0.6s ease-out, opacity 0.2s ease-in; + -ms-transition: -ms-transform 0.6s ease-out, opacity 0.2s ease-in; + -o-transition: -o-transform 0.6s ease-out, opacity 0.2s ease-in; + transition: transform 0.6s ease-out, opacity 0.2s ease-in; } + .transition-property { -webkit-transition-property: -webkit-transform; -moz-transition-property: -moz-transform; diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss index 523c1c76..fdb69e09 100644 --- a/test/fixtures/stylesheets/compass/sass/transition.scss +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -6,5 +6,6 @@ .transition-duration-list { @include transition-duration((0.2s, 0.5s, 0.2s)); } .single-transform-transition-without-delay { @include single-transition(transform, 0.6s, ease-out); } .single-transform-transition-with-delay { @include single-transition(transform, 0.6s, ease-out, 0.2s); } +.multiple-transitions { @include transition(transform 0.6s ease-out, opacity 0.2s ease-in) } .transition-property { @include transition-property(transform); } .multiple-transition-properties { @include transition-property((opacity, transform, left)); } From c1ce093cbcafb948e98e39089317da6cd7b336d2 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 14:51:59 -0800 Subject: [PATCH 270/290] Keeping things DRY, refactoring some shared functionality. All prefix fixes now route through an @build-prefix-values mixin. --- .../stylesheets/compass/css3/_transition.scss | 153 +++++------------- 1 file changed, 37 insertions(+), 116 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/css3/_transition.scss b/frameworks/compass/stylesheets/compass/css3/_transition.scss index 48ed2f82..f220d512 100644 --- a/frameworks/compass/stylesheets/compass/css3/_transition.scss +++ b/frameworks/compass/stylesheets/compass/css3/_transition.scss @@ -23,7 +23,7 @@ $default-transition-function: false !default; $default-transition-delay: false !default; -$transitionable-prefixed-properties: transform, transform-origin !default; +$transitionable-prefixed-values: transform, transform-origin !default; // One or more properties to transition // @@ -32,40 +32,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; @mixin transition-property($properties: $default-transition-property) { @if type-of($properties) == string { $properties: unquote($properties); } - $raw-properties: ($properties); - - $webkit-transition-property: compact(false); - $moz-transition-property: compact(false); - $ms-transition-property: compact(false); - $o-transition-property: compact(false); - - @each $property in $raw-properties { - $match: false; - - @each $prefixed-property in $transitionable-prefixed-properties { - @if $property == $prefixed-property { - $match: true; - } - } - - @if $match { - $webkit-transition-property: append($webkit-transition-property, -webkit-#{$property}, comma); - $moz-transition-property: append($moz-transition-property, -moz-#{$property}, comma); - $ms-transition-property: append($ms-transition-property, -ms-#{$property}, comma); - $o-transition-property: append($o-transition-property, -o-#{$property}, comma); - } @else { - $webkit-transition-property: append($webkit-transition-property, $property, comma); - $moz-transition-property: append($moz-transition-property, $property, comma); - $ms-transition-property: append($ms-transition-property, $property, comma); - $o-transition-property: append($o-transition-property, $property, comma); - } - } - - @if $experimental-support-for-webkit { -webkit-transition-property: $webkit-transition-property; } - @if $experimental-support-for-mozilla { -moz-transition-property: $moz-transition-property; } - @if $experimental-support-for-microsoft { -ms-transition-property: $ms-transition-property; } - @if $experimental-support-for-opera { -o-transition-property: $o-transition-property; } - transition-property: $properties; + @include build-prefix-values(transition-property, $properties); } // One or more durations in seconds @@ -112,60 +79,7 @@ $transitionable-prefixed-properties: transform, transform-origin !default; $function: $default-transition-function, $delay: $default-transition-delay ) { - $match: false; - - @each $prefixed-property in $transitionable-prefixed-properties { - @if $property == $prefixed-property { - $match: true; - } - } - - @if $property and $duration and $function { - // Shorthand (see https://github.com/chriseppstein/compass/issues/585) - @if $delay { - @if $match { - @if $experimental-support-for-webkit { -webkit-transition: -webkit-#{$property} $duration $function; -webkit-transition-delay: $delay; } - @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function $delay; } - @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function $delay; } - @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function $delay; } - transition: $property $duration $function $delay; - } @else { - @if $experimental-support-for-webkit { -webkit-transition: $property $duration $function; -webkit-transition-delay: $delay; } - @include experimental(transition, $property $duration $function $delay, - -moz, - not -webkit, - -o, - -ms, - not -khtml, - official - ); - } - } - @else { - @if $match { - @if $experimental-support-for-webkit { -webkit-transition: -webkit-#{$property} $duration $function; } - @if $experimental-support-for-mozilla { -moz-transition: -moz-#{$property} $duration $function; } - @if $experimental-support-for-microsoft { -ms-transition: -ms-#{$property} $duration $function; } - @if $experimental-support-for-opera { -o-transition: -o-#{$property} $duration $function; } - transition: $property $duration $function; - } @else { - @include experimental(transition, $property $duration $function, - -moz, - -webkit, - -o, - -ms, - not -khtml, - official - ); - } - } - } - @else { - @include transition-property($property); - @include transition-duration($duration); - @if $function { @include transition-timing-function($function); } - @if $delay { @include transition-delay($delay); } - } + @include build-prefix-values(transition, compact($property $duration $function, false), $delay); } @mixin transition( @@ -185,49 +99,56 @@ $transitionable-prefixed-properties: transform, transform-origin !default; } $transition : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10); - @include prefix-friendly-transition($transition); + @include build-prefix-values(transition, $transition); } -@mixin prefix-friendly-transition($transition) { - $raw-transition: ($transition); +@mixin build-prefix-values($property, $values, $delay: false) { + $raw-values: ($values); + $index: compact(false); - $webkit-transition: compact(false); - $moz-transition: compact(false); - $ms-transition: compact(false); - $o-transition: compact(false); + $webkit-value: compact(false); + $moz-value: compact(false); + $ms-value: compact(false); + $o-value: compact(false); - @each $single-transition in $raw-transition { - $property: nth($single-transition, 1); + @each $value in $raw-values { + $value: compact(join($value, false)); $match: false; - @each $prefixed-property in $transitionable-prefixed-properties { - @if $property == $prefixed-property { + @each $prefixed-value in $transitionable-prefixed-values { + @if index($value, $prefixed-value) { + $index: index($value, $prefixed-value); $match: true; } } @if $match { - $single-transition-suffix: compact(false); + $value-prefix: nth($value, $index); + $value-suffix: compact(false); - @for $i from 2 through length($single-transition) { - $single-transition-suffix: append($single-transition-suffix, nth($single-transition, $i), space); + @for $i from 2 through length($value) { + $value-suffix: append($value-suffix, nth($value, $i), space); } - $webkit-transition: append($webkit-transition, compact(join(-webkit-#{$property}, $single-transition-suffix)), comma); - $moz-transition: append($moz-transition, compact(join(-moz-#{$property}, $single-transition-suffix)), comma); - $ms-transition: append($ms-transition, compact(join(-ms-#{$property}, $single-transition-suffix)), comma); - $o-transition: append($o-transition, compact(join(-o-#{$property}, $single-transition-suffix)), comma); + $non-webkit-suffix: compact(append($value-suffix, $delay, space)); + + $webkit-value: append($webkit-value, compact(join(-webkit-#{$value-prefix}, $value-suffix)), comma); + $moz-value: append($moz-value, compact(join(-moz-#{$value-prefix}, $non-webkit-suffix)), comma); + $ms-value: append($ms-value, compact(join(-ms-#{$value-prefix}, $non-webkit-suffix)), comma); + $o-value: append($o-value, compact(join(-o-#{$value-prefix}, $non-webkit-suffix)), comma); } @else { - $webkit-transition: append($webkit-transition, $single-transition, comma); - $moz-transition: append($moz-transition, $single-transition, comma); - $ms-transition: append($ms-transition, $single-transition, comma); - $o-transition: append($o-transition, $single-transition, comma); + $non-webkit-value: compact(append($value, $delay, space)); + + $webkit-value: append($webkit-value, $value, comma); + $moz-value: append($moz-value, $non-webkit-value, comma); + $ms-value: append($ms-value, $non-webkit-value, comma); + $o-value: append($o-value, $non-webkit-value, comma); } } - @if $experimental-support-for-webkit { -webkit-transition: $webkit-transition; } - @if $experimental-support-for-mozilla { -moz-transition: $moz-transition; } - @if $experimental-support-for-microsoft { -ms-transition: $ms-transition; } - @if $experimental-support-for-opera { -o-transition: $o-transition; } - transition: $transition; + @if $experimental-support-for-webkit { -webkit-#{$property} : $webkit-value; @if $delay { -webkit-#{$property}-delay : $delay; } } + @if $experimental-support-for-mozilla { -moz-#{$property} : $moz-value; } + @if $experimental-support-for-microsoft { -ms-#{$property} : $ms-value; } + @if $experimental-support-for-opera { -o-#{$property} : $o-value; } + #{$property} : compact($values $delay); } From 94bef38312b1eefeeee1fbec27bb453db30e0da2 Mon Sep 17 00:00:00 2001 From: Richard Herrera Date: Sun, 26 Feb 2012 14:52:35 -0800 Subject: [PATCH 271/290] Adding a single transform transition stylesheet test. --- test/fixtures/stylesheets/compass/css/transition.css | 7 +++++++ test/fixtures/stylesheets/compass/sass/transition.scss | 1 + 2 files changed, 8 insertions(+) diff --git a/test/fixtures/stylesheets/compass/css/transition.css b/test/fixtures/stylesheets/compass/css/transition.css index 39087d7e..b9b21aea 100644 --- a/test/fixtures/stylesheets/compass/css/transition.css +++ b/test/fixtures/stylesheets/compass/css/transition.css @@ -42,6 +42,13 @@ -o-transition: -o-transform 0.6s ease-out 0.2s; transition: transform 0.6s ease-out 0.2s; } +.transform-transition { + -webkit-transition: -webkit-transform 0.6s ease-out; + -moz-transition: -moz-transform 0.6s ease-out; + -ms-transition: -ms-transform 0.6s ease-out; + -o-transition: -o-transform 0.6s ease-out; + transition: transform 0.6s ease-out; } + .multiple-transitions { -webkit-transition: -webkit-transform 0.6s ease-out, opacity 0.2s ease-in; -moz-transition: -moz-transform 0.6s ease-out, opacity 0.2s ease-in; diff --git a/test/fixtures/stylesheets/compass/sass/transition.scss b/test/fixtures/stylesheets/compass/sass/transition.scss index fdb69e09..16add41a 100644 --- a/test/fixtures/stylesheets/compass/sass/transition.scss +++ b/test/fixtures/stylesheets/compass/sass/transition.scss @@ -6,6 +6,7 @@ .transition-duration-list { @include transition-duration((0.2s, 0.5s, 0.2s)); } .single-transform-transition-without-delay { @include single-transition(transform, 0.6s, ease-out); } .single-transform-transition-with-delay { @include single-transition(transform, 0.6s, ease-out, 0.2s); } +.transform-transition { @include transition(transform 0.6s ease-out) } .multiple-transitions { @include transition(transform 0.6s ease-out, opacity 0.2s ease-in) } .transition-property { @include transition-property(transform); } .multiple-transition-properties { @include transition-property((opacity, transform, left)); } From 9b39b5707fd5d705d7c0f415965fcd036f741e2c Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Thu, 1 Mar 2012 13:48:34 -0500 Subject: [PATCH 272/290] removed unneeded timecop --- Gemfile | 4 +--- test/units/sprites/importer_test.rb | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 6f5eb63b..df642247 100644 --- a/Gemfile +++ b/Gemfile @@ -10,9 +10,7 @@ gem "css_parser", "~> 1.0.1" gem "sass", "~> 3.1" gem "haml", "~> 3.1" gem "rubyzip" -gem "livereload" -gem 'mocha' -gem 'timecop' +gem 'mocha' gem 'diff-lcs', '~> 1.1.2' diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb index e4030017..6691fa41 100644 --- a/test/units/sprites/importer_test.rb +++ b/test/units/sprites/importer_test.rb @@ -1,5 +1,5 @@ require 'test_helper' -require 'timecop' + class ImporterTest < Test::Unit::TestCase include SpriteHelper From 6a8926840404fd9f8383e017f47f2dda9a1fe8c7 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 4 Mar 2012 17:46:27 -0800 Subject: [PATCH 273/290] Whitespace --- lib/compass/configuration/helpers.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/compass/configuration/helpers.rb b/lib/compass/configuration/helpers.rb index 33071fc8..9ef97694 100644 --- a/lib/compass/configuration/helpers.rb +++ b/lib/compass/configuration/helpers.rb @@ -102,10 +102,7 @@ module Compass else add_configuration(:stand_alone) end - - - add_configuration(data) - + add_configuration(data) else add_configuration(options[:project_type] || configuration.project_type_without_default || (yield if block_given?) || :stand_alone) end From da895dab70688e61d62749dc98319d512053baeb Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Mon, 5 Mar 2012 12:05:30 -0800 Subject: [PATCH 274/290] ruby prof too --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 765bcee0..9d4eac85 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ gem "haml", "~> 3.1" gem "rcov", :platform => :mri_18 gem "rubyzip" gem "livereload" -gem "ruby-prof", :platform => :mri +gem "ruby-prof", :platform => :mri_18 gem 'autotest' gem 'autotest-fsevent' if RUBY_PLATFORM =~ /darwin/ From f1187ba44ea0e7b05a777a5aa2221dc4631b964b Mon Sep 17 00:00:00 2001 From: Brandon Mathis Date: Mon, 5 Mar 2012 16:25:49 -0600 Subject: [PATCH 275/290] Improved hide-text mixin performance and accessibility, closes #743 --- .../compass/typography/text/_replacement.scss | 8 +++----- test/integrations/sprites_test.rb | 12 ++++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss index 041f1053..0d184eb2 100644 --- a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +++ b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss @@ -26,9 +26,7 @@ // Hides text in an element so you can see the background. @mixin hide-text { - $approximate_em_value: 12px / 1em; - $wider_than_any_screen: -9999em; - text-indent: $wider_than_any_screen * $approximate_em_value; - overflow: hidden; - text-align: left; + font: 0/0 serif; + text-shadow: none; + color: transparent; } diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb index 3284f995..e7a14d94 100644 --- a/test/integrations/sprites_test.rb +++ b/test/integrations/sprites_test.rb @@ -773,18 +773,18 @@ class SpritesTest < Test::Unit::TestCase background:url('/colors-s58671cb5bb.png') no-repeat; } .blue { - text-indent:-119988px; - overflow:hidden; - text-align:left; + font: 0/0 serif; + text-shadow: none; + color: transparent; background-position:0 0; background-image:url('/colors-s58671cb5bb.png'); background-repeat:no-repeat; } .yellow { - text-indent:-119988px; - overflow:hidden; - text-align:left; + font: 0/0 serif; + text-shadow: none; + color: transparent; background-position:0 -10px; height:10px; width:10px; From 3fded657351e53860aa1579cd3f2bf037639d0cc Mon Sep 17 00:00:00 2001 From: Brandon Mathis Date: Mon, 5 Mar 2012 17:14:12 -0600 Subject: [PATCH 276/290] Added hide-text improvement to changelog --- doc-src/content/CHANGELOG.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 205a12f0..24e7c9cc 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,6 +14,14 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) +0.12.rc.0 (UNRELEASED) +------------------------- + +### Stylesheet Changes + +* Improved hide-text mixin for better performance and accessibility. + + 0.12.rc.0 (UNRELEASED) ------------------------- From 4812c5fea167cfe53030a2f6491016d358cc69d3 Mon Sep 17 00:00:00 2001 From: Maxime Thirouin Date: Tue, 6 Mar 2012 11:13:13 +0100 Subject: [PATCH 277/290] Fix #752 Add .eot (Embedded OpenType) to fonts format --- lib/compass/installers/manifest.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/installers/manifest.rb b/lib/compass/installers/manifest.rb index b5faf022..40d5d19e 100644 --- a/lib/compass/installers/manifest.rb +++ b/lib/compass/installers/manifest.rb @@ -49,7 +49,7 @@ module Compass type :stylesheet, :plural => :stylesheets, :extensions => %w(scss sass) type :image, :plural => :images, :extensions => %w(png gif jpg jpeg tiff gif) type :javascript, :plural => :javascripts, :extensions => %w(js) - type :font, :plural => :fonts, :extensions => %w(otf woff ttf) + type :font, :plural => :fonts, :extensions => %w(eot otf woff ttf) type :html, :plural => :html, :extensions => %w(html haml) type :file, :plural => :files type :directory, :plural => :directories From 55d4d36240195928f69a2c5d27ed9d1aec99a608 Mon Sep 17 00:00:00 2001 From: aaronchi Date: Tue, 6 Mar 2012 21:09:20 -0800 Subject: [PATCH 278/290] Use the corrent mime type for woff font files: http://stackoverflow.com/questions/3594823/mime-type-for-woff-fonts --- lib/compass/sass_extensions/functions/inline_image.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compass/sass_extensions/functions/inline_image.rb b/lib/compass/sass_extensions/functions/inline_image.rb index c0e732f1..fd7ca87f 100644 --- a/lib/compass/sass_extensions/functions/inline_image.rb +++ b/lib/compass/sass_extensions/functions/inline_image.rb @@ -42,7 +42,7 @@ private when /\.ttf$/i 'font/truetype' when /\.woff$/i - 'font/woff' + 'application/x-font-woff' when /\.off$/i 'font/openfont' when /\.([a-zA-Z]+)$/ From 0c290edd072bd0ee14fe72716f2ad22223f2761c Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Wed, 7 Mar 2012 23:35:02 -0800 Subject: [PATCH 279/290] Bring the legacy implementation of hide-text back as move-text-out-of-view and make hide-text a front end for the two methods. --- doc-src/content/CHANGELOG.markdown | 4 ++ .../compass/typography/text/_replacement.scss | 61 +++++++++++++++++-- .../stylesheets/compass/css/replacement.css | 19 ++++++ .../stylesheets/compass/sass/replacement.scss | 15 +++++ 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/stylesheets/compass/css/replacement.css create mode 100644 test/fixtures/stylesheets/compass/sass/replacement.scss diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 24e7c9cc..d4c5dafc 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -20,6 +20,10 @@ The Documentation for the [latest preview release](http://beta.compass-style.org ### Stylesheet Changes * Improved hide-text mixin for better performance and accessibility. + If you use `em` units on margins for elements that have hidden text, + you should use the `move-text-out-of-view` mixin instead or set + `$default-hide-text-method` to `move` to keep using the old method of + hiding text. 0.12.rc.0 (UNRELEASED) diff --git a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss index 0d184eb2..bcce661b 100644 --- a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +++ b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss @@ -1,3 +1,11 @@ +// Controls how text is hidden, can be one of: +// +// * squish - This method is more performant and robust but will cause issues if you +// use `em` units for margins on elements where the text is hidden. +// * move - The compass legacy method. Preferred if you use +// margins with `em` units on elements where text-hiding occurs. +$default-hide-text-method: squish; + // Hides html text and replaces it with an image. // If you use this on an inline element, you will need to change the display to block or inline-block. // Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height. @@ -7,8 +15,8 @@ // * `img` -- the relative path from the project image directory to the image. // * `x` -- the x position of the background image. // * `y` -- the y position of the background image. -@mixin replace-text($img, $x: 50%, $y: 50%) { - @include hide-text; +@mixin replace-text($img, $x: 50%, $y: 50%, $hide-method: $default-hide-text-method) { + @include hide-text($hide-method); background: { image: image-url($img); repeat: no-repeat; @@ -18,15 +26,58 @@ // Like the `replace-text` mixin, but also sets the width // and height of the element according the dimensions of the image. -@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%) { - @include replace-text($img, $x, $y); +@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%, $hide-method: $default-hide-text-method) { + @include replace-text($img, $x, $y, $hide-method); width: image-width($img); height: image-height($img); } // Hides text in an element so you can see the background. -@mixin hide-text { +// This mixin selects the `squish-text` mixin when the +// `$default-hide-text-method` is set to `squish` and +// selects the `move-text-out-of-view` mixin when set to `move`. +@mixin hide-text($method: $default-hide-text-method) { + @if $method == squish { + @include squish-text; + } @else if $method == move { + @include move-text-out-of-view; + } @else { + @warn "Unkown method: #{$default-hide-text-method}. Using move instead."; + @include move-text-out-of-view; + } +} + +// Hides text visually by squishing into nothingness and making it transparent +// in those browsers where it can't be squished. Almost all screen readers will +// still read the hidden text. +// +// This works on both block and inline elements and will hide child elements as long +// as they do not override `font`, `text-shadow`, or `color` with a higher specificity. +// +// This method may cause problems if you are using `em`-based margins. See +// [this blog post](http://nicolasgallagher.com/another-css-image-replacement-technique/) +// for more information. +// +// When `$default-hide-text-method` is set to `squish`, the `hide-text` mixin +// will default to this method. +@mixin squish-text { font: 0/0 serif; text-shadow: none; color: transparent; } + +// Hides text visually by moving it off the screen and hiding the scrollbars. +// Screen readers will still read the hidden text. +// +// This method will not work inline elements and may cause performance +// issues when used with css animations. +// +// When `$default-hide-text-method` is set to `move`, the `hide-text` mixin +// will default to this method. +@mixin move-text-out-of-view { + $approximate_em_value: 12px / 1em; + $wider_than_any_screen: -9999em; + text-indent: $wider_than_any_screen * $approximate_em_value; + overflow: hidden; + text-align: left; +} diff --git a/test/fixtures/stylesheets/compass/css/replacement.css b/test/fixtures/stylesheets/compass/css/replacement.css new file mode 100644 index 00000000..de66702c --- /dev/null +++ b/test/fixtures/stylesheets/compass/css/replacement.css @@ -0,0 +1,19 @@ +.squished-by-default { + font: 0/0 serif; + text-shadow: none; + color: transparent; } + +.moved-by-default { + text-indent: -119988px; + overflow: hidden; + text-align: left; } + +.squished { + font: 0/0 serif; + text-shadow: none; + color: transparent; } + +.moved { + text-indent: -119988px; + overflow: hidden; + text-align: left; } diff --git a/test/fixtures/stylesheets/compass/sass/replacement.scss b/test/fixtures/stylesheets/compass/sass/replacement.scss new file mode 100644 index 00000000..abc59f54 --- /dev/null +++ b/test/fixtures/stylesheets/compass/sass/replacement.scss @@ -0,0 +1,15 @@ +@import "compass/typography/text/replacement"; + +.squished-by-default { + @include hide-text; +} +$default-hide-text-method: move; +.moved-by-default { + @include hide-text; +} +.squished { + @include squish-text; +} +.moved { + @include move-text-out-of-view; +} From abcd6c897cb920a1df4456f4a3f6d29c1908c26d Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Thu, 8 Mar 2012 23:44:13 -0800 Subject: [PATCH 280/290] Revert "Bring the legacy implementation of hide-text back as move-text-out-of-view and make hide-text a front end for the two methods." This reverts commit 0c290edd072bd0ee14fe72716f2ad22223f2761c. --- doc-src/content/CHANGELOG.markdown | 4 -- .../compass/typography/text/_replacement.scss | 61 ++----------------- .../stylesheets/compass/css/replacement.css | 19 ------ .../stylesheets/compass/sass/replacement.scss | 15 ----- 4 files changed, 5 insertions(+), 94 deletions(-) delete mode 100644 test/fixtures/stylesheets/compass/css/replacement.css delete mode 100644 test/fixtures/stylesheets/compass/sass/replacement.scss diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index d4c5dafc..24e7c9cc 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -20,10 +20,6 @@ The Documentation for the [latest preview release](http://beta.compass-style.org ### Stylesheet Changes * Improved hide-text mixin for better performance and accessibility. - If you use `em` units on margins for elements that have hidden text, - you should use the `move-text-out-of-view` mixin instead or set - `$default-hide-text-method` to `move` to keep using the old method of - hiding text. 0.12.rc.0 (UNRELEASED) diff --git a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss index bcce661b..0d184eb2 100644 --- a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +++ b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss @@ -1,11 +1,3 @@ -// Controls how text is hidden, can be one of: -// -// * squish - This method is more performant and robust but will cause issues if you -// use `em` units for margins on elements where the text is hidden. -// * move - The compass legacy method. Preferred if you use -// margins with `em` units on elements where text-hiding occurs. -$default-hide-text-method: squish; - // Hides html text and replaces it with an image. // If you use this on an inline element, you will need to change the display to block or inline-block. // Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height. @@ -15,8 +7,8 @@ $default-hide-text-method: squish; // * `img` -- the relative path from the project image directory to the image. // * `x` -- the x position of the background image. // * `y` -- the y position of the background image. -@mixin replace-text($img, $x: 50%, $y: 50%, $hide-method: $default-hide-text-method) { - @include hide-text($hide-method); +@mixin replace-text($img, $x: 50%, $y: 50%) { + @include hide-text; background: { image: image-url($img); repeat: no-repeat; @@ -26,58 +18,15 @@ $default-hide-text-method: squish; // Like the `replace-text` mixin, but also sets the width // and height of the element according the dimensions of the image. -@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%, $hide-method: $default-hide-text-method) { - @include replace-text($img, $x, $y, $hide-method); +@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%) { + @include replace-text($img, $x, $y); width: image-width($img); height: image-height($img); } // Hides text in an element so you can see the background. -// This mixin selects the `squish-text` mixin when the -// `$default-hide-text-method` is set to `squish` and -// selects the `move-text-out-of-view` mixin when set to `move`. -@mixin hide-text($method: $default-hide-text-method) { - @if $method == squish { - @include squish-text; - } @else if $method == move { - @include move-text-out-of-view; - } @else { - @warn "Unkown method: #{$default-hide-text-method}. Using move instead."; - @include move-text-out-of-view; - } -} - -// Hides text visually by squishing into nothingness and making it transparent -// in those browsers where it can't be squished. Almost all screen readers will -// still read the hidden text. -// -// This works on both block and inline elements and will hide child elements as long -// as they do not override `font`, `text-shadow`, or `color` with a higher specificity. -// -// This method may cause problems if you are using `em`-based margins. See -// [this blog post](http://nicolasgallagher.com/another-css-image-replacement-technique/) -// for more information. -// -// When `$default-hide-text-method` is set to `squish`, the `hide-text` mixin -// will default to this method. -@mixin squish-text { +@mixin hide-text { font: 0/0 serif; text-shadow: none; color: transparent; } - -// Hides text visually by moving it off the screen and hiding the scrollbars. -// Screen readers will still read the hidden text. -// -// This method will not work inline elements and may cause performance -// issues when used with css animations. -// -// When `$default-hide-text-method` is set to `move`, the `hide-text` mixin -// will default to this method. -@mixin move-text-out-of-view { - $approximate_em_value: 12px / 1em; - $wider_than_any_screen: -9999em; - text-indent: $wider_than_any_screen * $approximate_em_value; - overflow: hidden; - text-align: left; -} diff --git a/test/fixtures/stylesheets/compass/css/replacement.css b/test/fixtures/stylesheets/compass/css/replacement.css deleted file mode 100644 index de66702c..00000000 --- a/test/fixtures/stylesheets/compass/css/replacement.css +++ /dev/null @@ -1,19 +0,0 @@ -.squished-by-default { - font: 0/0 serif; - text-shadow: none; - color: transparent; } - -.moved-by-default { - text-indent: -119988px; - overflow: hidden; - text-align: left; } - -.squished { - font: 0/0 serif; - text-shadow: none; - color: transparent; } - -.moved { - text-indent: -119988px; - overflow: hidden; - text-align: left; } diff --git a/test/fixtures/stylesheets/compass/sass/replacement.scss b/test/fixtures/stylesheets/compass/sass/replacement.scss deleted file mode 100644 index abc59f54..00000000 --- a/test/fixtures/stylesheets/compass/sass/replacement.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import "compass/typography/text/replacement"; - -.squished-by-default { - @include hide-text; -} -$default-hide-text-method: move; -.moved-by-default { - @include hide-text; -} -.squished { - @include squish-text; -} -.moved { - @include move-text-out-of-view; -} From 046d4688d15112e1509beee3fec085d12cb96261 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Thu, 8 Mar 2012 23:47:48 -0800 Subject: [PATCH 281/290] Use Scott Kellum's method of text hiding that is more performant and has no issue with em-based margins. --- .../stylesheets/compass/typography/text/_replacement.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss index 0d184eb2..a6b8166c 100644 --- a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +++ b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss @@ -26,7 +26,8 @@ // Hides text in an element so you can see the background. @mixin hide-text { - font: 0/0 serif; - text-shadow: none; - color: transparent; + // slightly wider than the box prevents issues with inline-block elements + text-indent: 110%; + white-space: nowrap; + overflow: hidden; } From 1fef2b2e5e1d0055bdcb9c2160a2bda00f9a803a Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 9 Mar 2012 00:08:41 -0800 Subject: [PATCH 282/290] Add docs for the user interface module --- .../reference/compass/css3/user_interface.haml | 15 +++++++++++++++ .../stylesheets/compass/css3/_user-interface.scss | 8 +++----- 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 doc-src/content/reference/compass/css3/user_interface.haml diff --git a/doc-src/content/reference/compass/css3/user_interface.haml b/doc-src/content/reference/compass/css3/user_interface.haml new file mode 100644 index 00000000..ca20a8d3 --- /dev/null +++ b/doc-src/content/reference/compass/css3/user_interface.haml @@ -0,0 +1,15 @@ +--- +title: Compass User Interface +crumb: User Interface +framework: compass +stylesheet: compass/css3/_user-interface.scss +meta_description: Declare an element inline block for all browsers. +layout: core +classnames: + - reference + - core + - css3 +--- +- render 'reference' do + %p + Provides mixins for the CSS3 User Interface module. diff --git a/frameworks/compass/stylesheets/compass/css3/_user-interface.scss b/frameworks/compass/stylesheets/compass/css3/_user-interface.scss index 7dbd3414..e78b2fe0 100644 --- a/frameworks/compass/stylesheets/compass/css3/_user-interface.scss +++ b/frameworks/compass/stylesheets/compass/css3/_user-interface.scss @@ -1,19 +1,17 @@ -@import "shared"; - // User Interface ------------------------------------------------------------ // This file can be expanded to handle all the user interface properties as // they become available in browsers: // http://www.w3.org/TR/2000/WD-css3-userint-20000216 +@import "shared"; + -// User Select --------------------------------------------------------------- // This property controls the selection model and granularity of an element. // // @param $select // [ none | text | toggle | element | elements | all | inherit ] - @mixin user-select($select) { $select: unquote($select); @include experimental(user-select, $select, -moz, -webkit, not -o, not -ms, -khtml, official ); -} \ No newline at end of file +} From d38fee361f8e50c87df10d003947c529446f83ab Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Fri, 9 Mar 2012 00:42:04 -0800 Subject: [PATCH 283/290] When an error occurs, display the imported file that caused the error if the error was not local error. --- lib/compass/compiler.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/compass/compiler.rb b/lib/compass/compiler.rb index 4e71cc2a..7292171b 100644 --- a/lib/compass/compiler.rb +++ b/lib/compass/compiler.rb @@ -160,8 +160,10 @@ module Compass # formatted to display in the browser (in development mode) # if there's an error. def handle_exception(sass_filename, css_filename, e) - formatted_error = "(Line #{e.sass_line}: #{e.message})" + exception_file = basename(e.sass_filename) file = basename(sass_filename) + exception_file = nil if exception_file == file + formatted_error = "(Line #{e.sass_line}#{ " of #{exception_file}" if exception_file}: #{e.message})" logger.record :error, file, formatted_error Compass.configuration.run_stylesheet_error(sass_filename, formatted_error) write_file css_filename, error_contents(e, sass_filename), options.merge(:force => true) From 32d8517f32b0c5277952053e3a5321cb21dcc9f2 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 17:48:00 -0700 Subject: [PATCH 284/290] Add the squish text mixin for hiding text in inline elements. --- .../compass/typography/text/_replacement.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss index a6b8166c..1f589893 100644 --- a/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss +++ b/frameworks/compass/stylesheets/compass/typography/text/_replacement.scss @@ -31,3 +31,12 @@ white-space: nowrap; overflow: hidden; } + +// Hides text in an element by squishing the text into oblivion. +// Use this if you need to hide text contained in an inline element +// but still have it read by a screen reader. +@mixin squish-text { + font: 0/0 serif; + text-shadow: none; + color: transparent; +} From 17ae2294abbe7c44a7110462cb14c95973c306a5 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 17:48:37 -0700 Subject: [PATCH 285/290] Update the changelog --- doc-src/content/CHANGELOG.markdown | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index 24e7c9cc..e967cbed 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -14,16 +14,22 @@ The Documentation for the [latest stable release](http://compass-style.org/docs/ The Documentation for the [latest preview release](http://beta.compass-style.org/) -0.12.rc.0 (UNRELEASED) -------------------------- +0.12.rc.2 (03/11/2012) +---------------------- ### Stylesheet Changes -* Improved hide-text mixin for better performance and accessibility. +* Improved [hide-text mixin](/reference/compass/typography/text/replacement/#mixin-hide-text) for better performance and accessibility. +* Added [squish-text mixin](/reference/compass/typography/text/replacement/#mixin-squish-text) to hide text on inline elements. -0.12.rc.0 (UNRELEASED) -------------------------- +0.12.rc.1 (02/02/2012) +---------------------- + +Give warnings for users who upgrade without knowing about the compass-rails gem. + +0.12.rc.0 (01/31/2012) +---------------------- ### Stylesheet Changes From 716ddf5d3b220f346d25e7ce04e7c66d57d7edbe Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 17:49:19 -0700 Subject: [PATCH 286/290] Take the beta status off of the new modules in 0.11 --- doc-src/content/reference/compass/css3/box_shadow.haml | 3 +-- doc-src/content/reference/compass/css3/images.haml | 1 - doc-src/content/reference/compass/css3/pie.haml | 3 +-- doc-src/content/reference/compass/css3/text-shadow.haml | 3 +-- doc-src/content/reference/compass/css3/transform.haml | 1 - 5 files changed, 3 insertions(+), 8 deletions(-) diff --git a/doc-src/content/reference/compass/css3/box_shadow.haml b/doc-src/content/reference/compass/css3/box_shadow.haml index ff4079b9..4ac8e6e0 100644 --- a/doc-src/content/reference/compass/css3/box_shadow.haml +++ b/doc-src/content/reference/compass/css3/box_shadow.haml @@ -5,7 +5,6 @@ framework: compass stylesheet: compass/css3/_box-shadow.scss meta_description: Specify the box shadow for all browsers. layout: core -beta: true classnames: - reference - core @@ -13,4 +12,4 @@ classnames: --- - render 'reference' do %p - The box-shadow mixins are used to apply an inset or drop shadow to a block element. \ No newline at end of file + The box-shadow mixins are used to apply an inset or drop shadow to a block element. diff --git a/doc-src/content/reference/compass/css3/images.haml b/doc-src/content/reference/compass/css3/images.haml index 653dcdee..7361edad 100644 --- a/doc-src/content/reference/compass/css3/images.haml +++ b/doc-src/content/reference/compass/css3/images.haml @@ -5,7 +5,6 @@ framework: compass stylesheet: compass/css3/_images.scss meta_description: Specify linear gradients and radial gradients for many browsers. layout: core -beta: true classnames: - reference - core diff --git a/doc-src/content/reference/compass/css3/pie.haml b/doc-src/content/reference/compass/css3/pie.haml index 5f096262..e81a33ff 100644 --- a/doc-src/content/reference/compass/css3/pie.haml +++ b/doc-src/content/reference/compass/css3/pie.haml @@ -5,7 +5,6 @@ framework: compass stylesheet: compass/css3/_pie.scss meta_description: Compass integration with the css3pie tool. layout: core -beta: true classnames: - reference - core @@ -76,4 +75,4 @@ classnames: * CSS PIE is written by and copyright to: [Jason Johnston](http://twitter.com/lojjic) * Compass is using css3pie version 1.0-beta3. It can be upgraded by downloading a new behavior file and replacing the one that comes with compass. - \ No newline at end of file + diff --git a/doc-src/content/reference/compass/css3/text-shadow.haml b/doc-src/content/reference/compass/css3/text-shadow.haml index 6f614e55..3122d952 100644 --- a/doc-src/content/reference/compass/css3/text-shadow.haml +++ b/doc-src/content/reference/compass/css3/text-shadow.haml @@ -4,7 +4,6 @@ crumb: Text Shadow framework: compass stylesheet: compass/css3/_text-shadow.scss meta_description: Specify the text shadow for all browsers. -beta: true layout: core classnames: - reference @@ -13,4 +12,4 @@ classnames: --- - render 'reference' do %p - Provides a mixin for CSS text shadows. See CSS3 spec: text-shadow. \ No newline at end of file + Provides a mixin for CSS text shadows. See CSS3 spec: text-shadow. diff --git a/doc-src/content/reference/compass/css3/transform.haml b/doc-src/content/reference/compass/css3/transform.haml index ee53a316..b86b9a8e 100644 --- a/doc-src/content/reference/compass/css3/transform.haml +++ b/doc-src/content/reference/compass/css3/transform.haml @@ -5,7 +5,6 @@ framework: compass stylesheet: compass/css3/_transform.scss meta_description: Specify transformations for many browsers. layout: core -beta: true classnames: - reference - core From aa71abb601582284524bccbd23e9de2b95e381f0 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 17:59:49 -0700 Subject: [PATCH 287/290] Add mime-type for eot fonts --- lib/compass/sass_extensions/functions/inline_image.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/compass/sass_extensions/functions/inline_image.rb b/lib/compass/sass_extensions/functions/inline_image.rb index fd7ca87f..5259f113 100644 --- a/lib/compass/sass_extensions/functions/inline_image.rb +++ b/lib/compass/sass_extensions/functions/inline_image.rb @@ -39,6 +39,8 @@ private 'image/svg+xml' when /\.otf$/i 'font/opentype' + when /\.eot$/i + 'application/vnd.ms-fontobject' when /\.ttf$/i 'font/truetype' when /\.woff$/i From 07c92170cf12b7db100854503ef2b4115f90f7e2 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 18:02:01 -0700 Subject: [PATCH 288/290] Add font file support changes to the changelog. --- doc-src/content/CHANGELOG.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index e967cbed..bde545b5 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -21,6 +21,7 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Improved [hide-text mixin](/reference/compass/typography/text/replacement/#mixin-hide-text) for better performance and accessibility. * Added [squish-text mixin](/reference/compass/typography/text/replacement/#mixin-squish-text) to hide text on inline elements. +* Fix the mime-type of embedded `woff` font files. Add support for Embedded OpenType fonts. 0.12.rc.1 (02/02/2012) From 34540bb7539360e789c01516e048b8e988f66d25 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 18:06:41 -0700 Subject: [PATCH 289/290] CHANGELOG entry for transiitions mixin fixes. --- doc-src/content/CHANGELOG.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index bde545b5..a498fe9a 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -21,6 +21,10 @@ The Documentation for the [latest preview release](http://beta.compass-style.org * Improved [hide-text mixin](/reference/compass/typography/text/replacement/#mixin-hide-text) for better performance and accessibility. * Added [squish-text mixin](/reference/compass/typography/text/replacement/#mixin-squish-text) to hide text on inline elements. +* Compass css3 transitions module now correctly handled transitioning of + prefixed properties. + +### Misc Changes * Fix the mime-type of embedded `woff` font files. Add support for Embedded OpenType fonts. From 4e4d8139506f7187ba86224445ada44ac1de5a97 Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sun, 11 Mar 2012 18:12:36 -0700 Subject: [PATCH 290/290] update the changelog with mention of new math functions. --- doc-src/content/CHANGELOG.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc-src/content/CHANGELOG.markdown b/doc-src/content/CHANGELOG.markdown index a498fe9a..5c6522a0 100644 --- a/doc-src/content/CHANGELOG.markdown +++ b/doc-src/content/CHANGELOG.markdown @@ -26,6 +26,8 @@ The Documentation for the [latest preview release](http://beta.compass-style.org ### Misc Changes * Fix the mime-type of embedded `woff` font files. Add support for Embedded OpenType fonts. +* New math functions are now available: `e()`, `log($number[, $base = e()])`, `sqrt($number)` + and `pow($number, $exponent)` 0.12.rc.1 (02/02/2012)