compass 0.11.beta.7 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/VERSION.yml +2 -2
  2. data/frameworks/compass/stylesheets/compass/layout/_grid-background.scss +40 -22
  3. data/frameworks/compass/stylesheets/compass/utilities/sprites/_base.scss +6 -1
  4. data/frameworks/compass/templates/extension/manifest.rb +8 -2
  5. data/lib/compass/commands/print_version.rb +3 -0
  6. data/lib/compass/commands/update_project.rb +23 -9
  7. data/lib/compass/commands/watch_project.rb +41 -8
  8. data/lib/compass/compiler.rb +2 -3
  9. data/lib/compass/configuration.rb +34 -0
  10. data/lib/compass/configuration/adapters.rb +6 -2
  11. data/lib/compass/configuration/data.rb +1 -0
  12. data/lib/compass/configuration/defaults.rb +1 -1
  13. data/lib/compass/configuration/serialization.rb +1 -0
  14. data/lib/compass/exec/project_options_parser.rb +3 -3
  15. data/lib/compass/sass_extensions/functions/gradient_support.rb +81 -65
  16. data/lib/compass/sass_extensions/sprites/sprites.rb +9 -0
  17. data/lib/compass/version.rb +1 -1
  18. data/test/configuration_test.rb +67 -6
  19. data/test/fixtures/stylesheets/blueprint/css/screen.css +1 -1
  20. data/test/fixtures/stylesheets/blueprint/css/single-imports/debug.css +1 -1
  21. data/test/fixtures/stylesheets/compass/css/gradients.css +46 -24
  22. data/test/fixtures/stylesheets/compass/css/grid_background.css +8 -0
  23. data/test/fixtures/stylesheets/compass/sass/gradients.sass +8 -2
  24. data/test/fixtures/stylesheets/compass/sass/grid_background.scss +4 -0
  25. metadata +18 -19
  26. data/lib/vendor/fssm/fssm.rb +0 -33
  27. data/lib/vendor/fssm/fssm/backends/fsevents.rb +0 -36
  28. data/lib/vendor/fssm/fssm/backends/inotify.rb +0 -26
  29. data/lib/vendor/fssm/fssm/backends/polling.rb +0 -25
  30. data/lib/vendor/fssm/fssm/backends/rubycocoa/fsevents.rb +0 -131
  31. data/lib/vendor/fssm/fssm/monitor.rb +0 -26
  32. data/lib/vendor/fssm/fssm/path.rb +0 -91
  33. data/lib/vendor/fssm/fssm/pathname.rb +0 -502
  34. data/lib/vendor/fssm/fssm/state/directory.rb +0 -57
  35. data/lib/vendor/fssm/fssm/state/file.rb +0 -24
  36. data/lib/vendor/fssm/fssm/support.rb +0 -63
  37. data/lib/vendor/fssm/fssm/tree.rb +0 -176
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 11
4
- :state: beta
5
- :build: 7
4
+ :build: 0
5
+ :name: Antares
@@ -2,27 +2,34 @@
2
2
  @import "compass/css3/background-size";
3
3
 
4
4
  // Set the color of your columns
5
- $grid-background-column-color : rgba(100, 100, 225, 0.25) !default;
5
+ $grid-background-column-color : rgba(100, 100, 225, 0.25) !default;
6
6
  // Set the color of your gutters
7
- $grid-background-gutter-color : rgba(0, 0, 0, 0) !default;
7
+ $grid-background-gutter-color : rgba(0, 0, 0, 0) !default;
8
8
 
9
9
  // Set the total number of columns in your grid
10
- $grid-background-total-columns : 24 !default;
10
+ $grid-background-total-columns : 24 !default;
11
11
  // Set the width of your columns
12
- $grid-background-column-width : 30px !default;
12
+ $grid-background-column-width : 30px !default;
13
13
  // Set the width of your gutters
14
- $grid-background-gutter-width : 10px !default;
14
+ $grid-background-gutter-width : 10px !default;
15
15
  // Set the offset, if your columns are padded in from the container edge
16
- $grid-background-offset : 0px !default;
16
+ $grid-background-offset : 0px !default;
17
17
 
18
18
  // Set the color of your baseline
19
- $grid-background-baseline-color : rgba(0, 0, 0, 0.5) !default;
19
+ $grid-background-baseline-color : rgba(0, 0, 0, 0.5) !default;
20
20
  // Set the height of your baseline grid
21
- $grid-background-baseline-height : 1.5em !default;
21
+ $grid-background-baseline-height : 1.5em !default;
22
+
23
+ // toggle your columns grids on and off
24
+ $show-column-grid-backgrounds : true !default;
25
+ // toggle your vertical grids on and off
26
+ $show-baseline-grid-backgrounds : true !default;
27
+ // toggle all your grids on and off
28
+ $show-grid-backgrounds : true !default;
22
29
 
23
30
  // optionally force your grid-image to remain fluid
24
31
  // no matter what units you used to declared your grid.
25
- $grid-background-force-fluid : false !default;
32
+ $grid-background-force-fluid : false !default;
26
33
 
27
34
 
28
35
  // Create the gradient needed for baseline grids
@@ -118,9 +125,11 @@ $grid-background-force-fluid : false !default;
118
125
  $baseline : $grid-background-baseline-height,
119
126
  $color : $grid-background-baseline-color
120
127
  ) {
121
- @include background-image(get-baseline-gradient($color));
122
- @include background-size(100% $baseline);
123
- background-position: left top;
128
+ @if $show-grid-backgrounds and $show-baseline-grid-backgrounds {
129
+ @include background-image(get-baseline-gradient($color));
130
+ @include background-size(100% $baseline);
131
+ background-position: left top;
132
+ }
124
133
  }
125
134
 
126
135
  // Add just the horizontal grid to an element's background
@@ -133,10 +142,12 @@ $grid-background-force-fluid : false !default;
133
142
  $gutter-color : $grid-background-gutter-color,
134
143
  $force-fluid : $grid-background-force-fluid
135
144
  ) {
136
- @include background-image(
137
- get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
138
- );
139
- background-position: left top;
145
+ @if $show-grid-backgrounds and $show-column-grid-backgrounds {
146
+ @include background-image(
147
+ get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
148
+ );
149
+ background-position: left top;
150
+ }
140
151
  }
141
152
 
142
153
  // Add both horizontal and baseline grids to an element's background
@@ -151,10 +162,17 @@ $grid-background-force-fluid : false !default;
151
162
  $baseline-color : $grid-background-baseline-color,
152
163
  $force-fluid : $grid-background-force-fluid
153
164
  ) {
154
- @include background-image(
155
- get-baseline-gradient($baseline-color),
156
- get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
157
- );
158
- @include background-size(100% $baseline, auto);
159
- background-position: left top;
165
+ @if $show-grid-backgrounds {
166
+ @if $show-baseline-grid-backgrounds and $show-column-grid-backgrounds {
167
+ @include background-image(
168
+ get-baseline-gradient($baseline-color),
169
+ get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
170
+ );
171
+ @include background-size(100% $baseline, auto);
172
+ background-position: left top;
173
+ } @else {
174
+ @include baseline-grid-background($baseline, $baseline-color);
175
+ @include column-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid);
176
+ }
177
+ }
160
178
  }
@@ -20,12 +20,17 @@ $sprite-selectors: hover, target, active !default;
20
20
  // class or you can specify the `sprite-url` explicitly like this:
21
21
  //
22
22
  // background: $map no-repeat;
23
+
24
+ $disable-magic-sprite-selectors:false !default;
25
+
23
26
  @mixin sprite($map, $sprite, $dimensions: false, $offset-x: 0, $offset-y: 0) {
24
27
  @include sprite-background-position($map, $sprite, $offset-x, $offset-y);
25
28
  @if $dimensions {
26
29
  @include sprite-dimensions($map, $sprite);
27
30
  }
28
- @include sprite-selectors($map, $sprite, $sprite);
31
+ @if not $disable-magic-sprite-selectors {
32
+ @include sprite-selectors($map, $sprite, $sprite);
33
+ }
29
34
  }
30
35
 
31
36
  // Include the selectors for the `$sprite` given the `$map` and the
@@ -1,8 +1,14 @@
1
1
  description "Generate a compass extension."
2
2
 
3
- file 'stylesheets/main.sass', :to => "stylesheets/_#{File.basename(options[:pattern_name]||options[:project_name]||'main')}.sass"
3
+ unless options.include?(:preferred_syntax)
4
+ options[:preferred_syntax] = 'sass'
5
+ end
6
+
4
7
  file 'templates/project/manifest.rb'
5
- file 'templates/project/screen.sass'
8
+ file "stylesheets/main.sass", :to => "stylesheets/_#{File.basename(options[:pattern_name]||options[:project_name]||'main')}.#{options[:preferred_syntax]}"
9
+
10
+ file "templates/project/screen.sass", :to => "templates/project/screen.#{options[:preferred_syntax]}"
11
+
6
12
 
7
13
  help %Q{
8
14
  To generate a compass extension:
@@ -57,6 +57,9 @@ Options:
57
57
  def long_output_string
58
58
  lines = []
59
59
  lines << "Compass #{::Compass.version[:string]}"
60
+ if name = ::Compass.version[:name]
61
+ lines.last << " (#{name})"
62
+ end
60
63
  lines << "Copyright (c) 2008-#{Time.now.year} Chris Eppstein"
61
64
  lines << "Released under the MIT License."
62
65
  lines << "Compass is charityware."
@@ -49,17 +49,28 @@ module Compass
49
49
  end
50
50
 
51
51
  def new_compiler_instance(additional_options = {})
52
- compiler_opts = Compass.sass_engine_options
53
- compiler_opts.merge!(:force => options[:force],
54
- :sass_files => explicit_sass_files,
55
- :dry_run => options[:dry_run])
56
- compiler_opts[:quiet] = options[:quiet] if options[:quiet]
57
- compiler_opts[:time] = options[:time] if options[:time]
58
- compiler_opts.merge!(additional_options)
59
- Compass::Compiler.new(working_path,
52
+ @compiler_opts ||= begin
53
+ compiler_opts = Compass.sass_engine_options
54
+ compiler_opts.merge!(:force => options[:force],
55
+ :sass_files => explicit_sass_files,
56
+ :dry_run => options[:dry_run])
57
+ compiler_opts[:quiet] = options[:quiet] if options[:quiet]
58
+ compiler_opts[:time] = options[:time] if options[:time]
59
+ compiler_opts
60
+ end
61
+
62
+ @memory_store ||= Sass::CacheStores::Memory.new
63
+ @backing_store ||= compiler_opts[:cache_store]
64
+ @backing_store ||= Sass::CacheStores::Filesystem.new(determine_cache_location)
65
+ @cache_store ||= Sass::CacheStores::Chain.new(@memory_store, @backing_store)
66
+ @memory_store.reset!
67
+
68
+ Compass::Compiler.new(
69
+ working_path,
60
70
  Compass.configuration.sass_path,
61
71
  Compass.configuration.css_path,
62
- compiler_opts)
72
+ @compiler_opts.merge(:cache_store => @cache_store).merge(additional_options)
73
+ )
63
74
  end
64
75
 
65
76
  def explicit_sass_files
@@ -73,6 +84,9 @@ module Compass
73
84
  end
74
85
  end
75
86
 
87
+ def determine_cache_location
88
+ Compass.configuration.cache_path || Sass::Plugin.options[:cache_location] || File.join(working_path, ".sass-cache")
89
+ end
76
90
 
77
91
  class << self
78
92
  def option_parser(arguments)
@@ -2,6 +2,7 @@ require 'fileutils'
2
2
  require 'pathname'
3
3
  require 'compass/commands/base'
4
4
  require 'compass/commands/update_project'
5
+ require 'sass/plugin'
5
6
 
6
7
  module Compass
7
8
  module Commands
@@ -24,12 +25,39 @@ module Compass
24
25
 
25
26
  end
26
27
  end
28
+ module MemoryDebugger
29
+ def report_on_instances(type, options = {})
30
+ @@runs ||= 0
31
+ @@runs += 1
32
+ @@object_id_tracker ||= {}
33
+ @@object_id_tracker[type] ||= []
34
+ GC.start
35
+ sleep options.fetch(:gc_pause, 1)
36
+ count = ObjectSpace.each_object(type) do |obj|
37
+ if options.fetch(:verbose, true)
38
+ if @@runs > 2
39
+ if !@@object_id_tracker[type].include?(obj.object_id)
40
+ begin
41
+ puts obj.inspect
42
+ rescue
43
+ end
44
+ puts "#{obj.class.name}:#{obj.object_id}"
45
+ end
46
+ end
47
+ @@object_id_tracker[type] << obj.object_id
48
+ end
49
+ end
50
+ puts "#{type}: #{count} instances."
51
+ end
52
+ end
27
53
  class WatchProject < UpdateProject
28
54
 
29
55
  register :watch
30
56
 
31
57
  attr_accessor :last_update_time, :last_sass_files
32
58
 
59
+ include MemoryDebugger
60
+
33
61
  def perform
34
62
  Signal.trap("INT") do
35
63
  puts ""
@@ -39,12 +67,8 @@ module Compass
39
67
  check_for_sass_files!(new_compiler_instance)
40
68
  recompile
41
69
 
42
- begin
43
- require 'fssm'
44
- rescue LoadError
45
- $: << File.join(Compass.lib_directory, 'vendor', 'fssm')
46
- retry
47
- end
70
+ require 'fssm'
71
+
48
72
 
49
73
  if options[:poll]
50
74
  require "fssm/backends/polling"
@@ -58,8 +82,10 @@ module Compass
58
82
 
59
83
  puts ">>> Compass is #{action} for changes. Press Ctrl-C to Stop."
60
84
 
85
+ begin
61
86
  FSSM.monitor do |monitor|
62
87
  Compass.configuration.sass_load_paths.each do |load_path|
88
+ load_path = load_path.root if load_path.respond_to?(:root)
63
89
  next unless load_path.is_a? String
64
90
  monitor.path load_path do |path|
65
91
  path.glob '**/*.s[ac]ss'
@@ -88,7 +114,12 @@ module Compass
88
114
  end
89
115
 
90
116
  end
91
-
117
+ rescue FSSM::CallbackError => e
118
+ # FSSM catches exit? WTF.
119
+ if e.message =~ /exit/
120
+ exit
121
+ end
122
+ end
92
123
  end
93
124
 
94
125
  def remove_obsolete_css(base = nil, relative = nil)
@@ -103,11 +134,13 @@ module Compass
103
134
  end
104
135
 
105
136
  def recompile(base = nil, relative = nil)
137
+ @memory_cache.reset! if @memory_cache
106
138
  compiler = new_compiler_instance(:quiet => true)
107
139
  if file = compiler.out_of_date?
108
140
  begin
109
- puts ">>> Change detected to: #{file}"
141
+ puts ">>> Change detected to: #{relative || compiler.relative_stylesheet_name(file)}"
110
142
  compiler.run
143
+ GC.start
111
144
  rescue StandardError => e
112
145
  ::Compass::Exec::Helpers.report_error(e, options)
113
146
  end
@@ -11,8 +11,7 @@ module Compass
11
11
  self.logger = options.delete(:logger)
12
12
  self.options = options
13
13
  self.options[:cache_location] ||= determine_cache_location
14
- Compass.configure_sass_plugin!
15
- self.importer = Sass::Importers::Filesystem.new(from)
14
+ options[:importer] = self.importer = Sass::Importers::Filesystem.new(from)
16
15
  self.staleness_checker = Sass::Plugin::StalenessChecker.new(options)
17
16
  end
18
17
 
@@ -58,7 +57,7 @@ module Compass
58
57
  end
59
58
 
60
59
  def needs_update?(css_filename, sass_filename)
61
- staleness_checker.stylesheet_needs_update?(css_filename, relative_stylesheet_name(sass_filename), importer)
60
+ staleness_checker.stylesheet_needs_update?(css_filename, File.expand_path(sass_filename), importer)
62
61
  end
63
62
 
64
63
  # Determines if the configuration file is newer than any css file
@@ -41,6 +41,40 @@ module Compass
41
41
  :sprite_engine
42
42
  ].flatten
43
43
 
44
+ # Registers a new configuration property.
45
+ # Extensions can use this to add new configuration options to compass.
46
+ #
47
+ # @param [Symbol] name The name of the property.
48
+ # @param [String] comment A comment for the property.
49
+ # @param [Proc] default A method to calculate the default value for the property.
50
+ # The proc is executed in the context of the project's configuration data.
51
+ def self.add_configuration_property(name, comment = nil, &default)
52
+ ATTRIBUTES << name
53
+ if comment.is_a?(String)
54
+ unless comment[0..0] == "#"
55
+ comment = "# #{comment}"
56
+ end
57
+ unless comment[-1..-1] == "\n"
58
+ comment = comment + "\n"
59
+ end
60
+ Data.class_eval <<-COMMENT
61
+ def comment_for_#{name}
62
+ #{comment.inspect}
63
+ end
64
+ COMMENT
65
+ end
66
+ Data.send(:define_method, :"default_#{name}", &default) if default
67
+ Data.inherited_accessor(name)
68
+ if name.to_s =~ /dir|path/
69
+ strip_trailing_separator(name)
70
+ end
71
+ end
72
+
73
+ # For testing purposes
74
+ def self.remove_configuration_property(name)
75
+ ATTRIBUTES.delete(name)
76
+ end
77
+
44
78
  end
45
79
  end
46
80
 
@@ -55,10 +55,14 @@ module Compass
55
55
  def sass_load_paths
56
56
  load_paths = []
57
57
  load_paths << sass_path if sass_path
58
- Compass::Frameworks::ALL.each do |framework|
59
- load_paths << framework.stylesheets_directory if File.exists?(framework.stylesheets_directory)
58
+ Compass::Frameworks::ALL.each do |f|
59
+ load_paths << f.stylesheets_directory if File.directory?(f.stylesheets_directory)
60
60
  end
61
61
  load_paths += resolve_additional_import_paths
62
+ load_paths.map! do |p|
63
+ next p if p.respond_to?(:find_relative)
64
+ Sass::Importers::Filesystem.new(p.to_s)
65
+ end
62
66
  load_paths << Compass::Sprites.new
63
67
  load_paths
64
68
  end
@@ -125,6 +125,7 @@ module Compass
125
125
  Compass::Frameworks.register_directory framework_dir
126
126
  end
127
127
 
128
+ # Finds all extensions within a directory and registers them.
128
129
  def discover(frameworks_dir)
129
130
  (self.framework_path ||= []) << frameworks_dir
130
131
  Compass::Frameworks.discover frameworks_dir
@@ -30,7 +30,7 @@ module Compass
30
30
  if top_level.environment == :development
31
31
  :expanded
32
32
  else
33
- :compact
33
+ :compressed
34
34
  end
35
35
  end
36
36
 
@@ -50,6 +50,7 @@ module Compass
50
50
  $stderr.puts "WARNING: #{prop} is code and cannot be written to a file. You'll need to copy it yourself."
51
51
  end
52
52
  if respond_to?("comment_for_#{prop}")
53
+ contents << "\n"
53
54
  contents << send("comment_for_#{prop}")
54
55
  end
55
56
  if block_given? && (to_emit = yield(prop, value))
@@ -37,14 +37,14 @@ module Compass::Exec::ProjectOptionsParser
37
37
  end
38
38
 
39
39
  opts.on('-e ENV', '--environment ENV', [:development, :production], 'Use sensible defaults for your current environment.',
40
- ' One of: development, production (default)') do |env|
40
+ ' One of: development (default), production') do |env|
41
41
  self.options[:environment] = env
42
- end
42
+ end
43
43
 
44
44
  opts.on('-s STYLE', '--output-style STYLE', [:nested, :expanded, :compact, :compressed], 'Select a CSS output mode.',
45
45
  ' One of: nested, expanded, compact, compressed') do |style|
46
46
  self.options[:output_style] = style
47
- end
47
+ end
48
48
 
49
49
  opts.on('--relative-assets', :NONE, 'Make compass asset helpers generate relative urls to assets.') do
50
50
  self.options[:relative_assets] = true
@@ -33,82 +33,112 @@ module Compass::SassExtensions::Functions::GradientSupport
33
33
  end
34
34
  end
35
35
 
36
+ module Gradient
37
+
38
+ def self.included(base)
39
+ base.extend ClassMethods
40
+ end
41
+
42
+ module ClassMethods
43
+ def standardized_prefix(prefix)
44
+ class_eval %Q{
45
+ def to_#{prefix}(options = self.options)
46
+ Sass::Script::String.new("-#{prefix}-\#{to_s(options)}")
47
+ end
48
+ }
49
+ end
50
+ end
51
+
52
+ def inspect
53
+ to_s
54
+ end
55
+
56
+ def supports?(aspect)
57
+ GRADIENT_ASPECTS.include?(aspect)
58
+ end
59
+
60
+ def has_aspect?
61
+ true
62
+ end
63
+
64
+ def angle?(value)
65
+ value.is_a?(Sass::Script::Number) &&
66
+ value.numerator_units.size == 1 &&
67
+ value.numerator_units.first == "deg" &&
68
+ value.denominator_units.empty?
69
+ end
70
+
71
+ end
72
+
36
73
  class RadialGradient < Sass::Script::Literal
37
- attr_accessor :position_or_angle, :shape_and_size, :color_stops
74
+ include Gradient
75
+
76
+ attr_accessor :position, :shape_and_size, :color_stops
77
+
38
78
  def children
39
- [color_stops, position_or_angle, shape_and_size].compact
79
+ [color_stops, position, shape_and_size].compact
40
80
  end
41
- def initialize(position_or_angle, shape_and_size, color_stops)
81
+
82
+ def initialize(position, shape_and_size, color_stops)
42
83
  unless color_stops.value.size >= 2
43
84
  raise Sass::SyntaxError, "At least two color stops are required for a radial-gradient"
44
85
  end
45
- self.position_or_angle = position_or_angle
86
+ if angle?(position)
87
+ raise Sass::SyntaxError, "CSS no longer allows angles in radial-gradients."
88
+ end
89
+ self.position = position
46
90
  self.shape_and_size = shape_and_size
47
91
  self.color_stops = color_stops
48
92
  end
49
- def inspect
50
- to_s
51
- end
93
+
52
94
  def to_s(options = self.options)
53
95
  s = "radial-gradient("
54
- s << position_or_angle.to_s(options) << ", " if position_or_angle
96
+ s << position.to_s(options) << ", " if position
55
97
  s << shape_and_size.to_s(options) << ", " if shape_and_size
56
98
  s << color_stops.to_s(options)
57
99
  s << ")"
58
100
  end
59
- def supports?(aspect)
60
- if aspect == "svg"
61
- if position_or_angle.nil? || is_position(position_or_angle).to_bool || is_position_list(position_or_angle).to_bool
62
- true
63
- else
64
- Compass::Util.compass_warn("Warning: Angle-based gradients are not yet supported in SVG. Found: #{position_or_angle}")
65
- false
66
- end
67
- else
68
- GRADIENT_ASPECTS.include?(aspect)
69
- end
70
- end
71
- def has_aspect?
72
- true
73
- end
74
- def to_webkit(options = self.options)
75
- Sass::Script::String.new("-webkit-#{to_s(options)}")
76
- end
101
+
102
+ standardized_prefix :webkit
103
+ standardized_prefix :moz
104
+ standardized_prefix :o
105
+
77
106
  def to_owg(options = self.options)
78
107
  args = [
79
- grad_point(position_or_angle || _center_position),
108
+ grad_point(position || _center_position),
80
109
  Sass::Script::String.new("0"),
81
- grad_point(position_or_angle || _center_position),
110
+ grad_point(position || _center_position),
82
111
  grad_end_position(color_stops, Sass::Script::Bool.new(true)),
83
112
  grad_color_stops(color_stops)
84
113
  ]
85
114
  args.each {|a| a.options = options}
86
115
  Sass::Script::String.new("-webkit-gradient(radial, #{args.join(', ')})")
87
116
  end
88
- def to_moz(options = self.options)
89
- Sass::Script::String.new("-moz-#{to_s(options)}")
90
- end
91
- def to_o(options = self.options)
92
- Sass::Script::String.new("-o-#{to_s(options)}")
93
- end
117
+
94
118
  def to_svg(options = self.options)
95
119
  # XXX Add shape support if possible
96
- radial_svg_gradient(color_stops, position_or_angle || _center_position)
120
+ radial_svg_gradient(color_stops, position || _center_position)
97
121
  end
122
+
98
123
  def to_pie(options = self.options)
99
124
  Compass::Logger.new.record(:warning, "PIE does not support radial-gradient.")
100
125
  Sass::Script::String.new("-pie-radial-gradient(unsupported)")
101
126
  end
127
+
102
128
  def to_css2(options = self.options)
103
129
  Sass::Script::String.new("")
104
130
  end
105
131
  end
106
132
 
107
133
  class LinearGradient < Sass::Script::Literal
134
+ include Gradient
135
+
108
136
  attr_accessor :color_stops, :position_or_angle
137
+
109
138
  def children
110
139
  [color_stops, position_or_angle].compact
111
140
  end
141
+
112
142
  def initialize(position_or_angle, color_stops)
113
143
  unless color_stops.value.size >= 2
114
144
  raise Sass::SyntaxError, "At least two color stops are required for a linear-gradient"
@@ -116,33 +146,18 @@ module Compass::SassExtensions::Functions::GradientSupport
116
146
  self.position_or_angle = position_or_angle
117
147
  self.color_stops = color_stops
118
148
  end
119
- def inspect
120
- to_s
121
- end
149
+
122
150
  def to_s(options = self.options)
123
151
  s = "linear-gradient("
124
152
  s << position_or_angle.to_s(options) << ", " if position_or_angle
125
153
  s << color_stops.to_s(options)
126
154
  s << ")"
127
155
  end
128
- def supports?(aspect)
129
- if aspect == "svg"
130
- if position_or_angle.nil? || is_position(position_or_angle).to_bool || is_position_list(position_or_angle).to_bool
131
- true
132
- else
133
- Compass::Util.compass_warn("Warning: Angle-based gradients are not yet supported in SVG. Found: #{position_or_angle}")
134
- false
135
- end
136
- else
137
- GRADIENT_ASPECTS.include?(aspect)
138
- end
139
- end
140
- def has_aspect?
141
- true
142
- end
143
- def to_webkit(options = self.options)
144
- Sass::Script::String.new("-webkit-#{to_s(options)}")
145
- end
156
+
157
+ standardized_prefix :webkit
158
+ standardized_prefix :moz
159
+ standardized_prefix :o
160
+
146
161
  # Output the original webkit gradient syntax
147
162
  def to_owg(options = self.options)
148
163
  args = []
@@ -152,20 +167,17 @@ module Compass::SassExtensions::Functions::GradientSupport
152
167
  args.each{|a| a.options = options}
153
168
  Sass::Script::String.new("-webkit-gradient(linear, #{args.join(', ')})")
154
169
  end
155
- def to_moz(options = self.options)
156
- Sass::Script::String.new("-moz-#{to_s(options)}")
157
- end
158
- def to_o(options = self.options)
159
- Sass::Script::String.new("-o-#{to_s(options)}")
160
- end
170
+
161
171
  def to_svg(options = self.options)
162
172
  linear_svg_gradient(color_stops, position_or_angle || Sass::Script::String.new("top"))
163
173
  end
174
+
164
175
  def to_pie(options = self.options)
165
176
  # PIE just uses the standard rep, but the property is prefixed so
166
177
  # the presence of this attribute helps flag when to render a special rule.
167
178
  Sass::Script::String.new to_s(options)
168
179
  end
180
+
169
181
  def to_css2(options = self.options)
170
182
  Sass::Script::String.new("")
171
183
  end
@@ -289,7 +301,7 @@ module Compass::SassExtensions::Functions::GradientSupport
289
301
  stop = pos.stop
290
302
  stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units && max.numerator_units != ["%"]
291
303
  # Make sure the color stops are specified in the right order.
292
- if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && stop.value < last_value.value
304
+ if last_value && stop.numerator_units == last_value.numerator_units && stop.denominator_units == last_value.denominator_units && (stop.value * 1000).round < (last_value.value * 1000).round
293
305
  raise Sass::SyntaxError.new("Color stops must be specified in increasing order. #{stop.value} came after #{last_value.value}.")
294
306
  end
295
307
  last_value = stop
@@ -445,9 +457,13 @@ module Compass::SassExtensions::Functions::GradientSupport
445
457
  arg.all?{|a| color_stop?(a)} ? arg : nil
446
458
  end
447
459
  end
448
-
460
+
449
461
  def linear_svg(color_stops, x1, y1, x2, y2)
450
- gradient = %Q{<linearGradient id="grad" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}">#{color_stops_svg(color_stops)}</linearGradient>}
462
+ transform = ''
463
+ if angle?(position_or_angle)
464
+ transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
465
+ end
466
+ gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
451
467
  svg(gradient)
452
468
  end
453
469