compass-core 1.0.0.alpha.20 → 1.0.0.alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 540ff031bc6064fc019098cdc36c0519ef098674
4
- data.tar.gz: 6fdb9c93adb91d4c741cee0409a031aa82dcce8e
3
+ metadata.gz: ae333010970a851ce2a6e4afb2a3dadcd436039a
4
+ data.tar.gz: 0d100b0b67a12b9dd48e74c4de4ce4f4b98f1cc1
5
5
  SHA512:
6
- metadata.gz: b66e7785fc379819945af49b8bb3ea77e9b364811c58da26700c7399a74bd17baf1a64ef2bd401cfdf4dac4d84b74f21f1262263e52709d3ef33dc6714d139a2
7
- data.tar.gz: 2141cfd943f2db76606d25c1cc6959a1bef38779455a8148fb254eb525682e56f2e0161a7ec6c1f533e39dc586652c1670cff1c4ae17737cb9531773c8987978
6
+ metadata.gz: 779b3f83ef661bff586fe40d5e19974f62b7b8a96a4b5038ca0ef59fef3ae1571d9292a14c001def22370dce0b19cd6a23305dfff79f82fd3bff60ad4026b2f2
7
+ data.tar.gz: d171aa6c8abf76fe03f530ffe31ef33a37bdddad66ab929798cf3c4bb9531d6ff136b518dcf6ec700871cbfa3e4d82133754e20845c997e126ff8f7c5d6bcb9b
data/RELEASE_VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.alpha.20
1
+ 1.0.0.alpha.21
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.alpha.19
1
+ 1.0.0.alpha.20
@@ -286,7 +286,7 @@ module Compass
286
286
 
287
287
  def debug
288
288
  normalized_attrs = {}
289
- ATTRIBUTES.each do |prop|
289
+ (ATTRIBUTES + ARRAY_ATTRIBUTES).each do |prop|
290
290
  values = []
291
291
  chain.each do |instance|
292
292
  values << {
@@ -2,6 +2,147 @@ module Compass::Core::SassExtensions::Functions::GradientSupport
2
2
 
3
3
  GRADIENT_ASPECTS = %w(webkit moz svg css2 o owg).freeze
4
4
 
5
+ class CSS3AngleToSVGConverter
6
+ include Math
7
+
8
+ def initialize(angle)
9
+ @original_angle = angle
10
+ @angle = handle_keywords(angle)
11
+ @angle = in_radians(@angle) % (2 * PI)
12
+ @quadrant = (@angle * 2 / PI).to_i
13
+ @angle = case @quadrant
14
+ when 0
15
+ @angle
16
+ when 1
17
+ PI - @angle
18
+ when 2
19
+ @angle - PI
20
+ when 3
21
+ 2 * PI - @angle
22
+ end
23
+ end
24
+
25
+ TOP = 1
26
+ BOTTOM = 2
27
+ RIGHT = 4
28
+ LEFT = 8
29
+
30
+ DIR_KEYWORDS_TO_ANGLE = {
31
+ TOP => 0,
32
+ TOP | RIGHT => 45,
33
+ RIGHT => 90,
34
+ BOTTOM | RIGHT => 135,
35
+ BOTTOM => 180,
36
+ BOTTOM | LEFT => 225,
37
+ LEFT => 270,
38
+ TOP | LEFT => 315,
39
+ }
40
+
41
+ def handle_keywords(angle)
42
+ if angle.is_a?(Sass::Script::Value::List) || angle.is_a?(Sass::Script::Value::String)
43
+ direction = angle.to_sass
44
+ is_end_point = !!/\bto\b/i.match(direction)
45
+ dir = 0
46
+ dir |= TOP if /\btop\b/i.match(direction)
47
+ dir |= BOTTOM if /\bbottom\b/i.match(direction)
48
+ dir |= RIGHT if /\bright\b/i.match(direction)
49
+ dir |= LEFT if /\bleft\b/i.match(direction)
50
+ if (r = DIR_KEYWORDS_TO_ANGLE[dir])
51
+ r += 180 unless is_end_point
52
+ Sass::Script::Value::Number.new(r, %w(deg), [])
53
+ else
54
+ raise Sass::SyntaxError, "Unknown direction: #{angle.to_sass}"
55
+ end
56
+ else
57
+ angle
58
+ end
59
+ end
60
+
61
+ def in_radians(angle)
62
+ case angle.unit_str
63
+ when "deg"
64
+ angle.value * PI / 180.0
65
+ when "grad"
66
+ angle.value * PI / 200.0
67
+ when "rad"
68
+ angle.value
69
+ when "turn"
70
+ angle.value * PI * 2
71
+ else
72
+ raise Sass::SyntaxError.new("#{angle.unit_str} is not an angle")
73
+ end
74
+ end
75
+
76
+ def sin2(a)
77
+ v = sin(a)
78
+ v * v
79
+ end
80
+
81
+ def x
82
+ @x ||= if @angle > 1.570621793869697
83
+ 1.0 # avoid floating point rounding error at the asymptote
84
+ else
85
+ tan(@angle) + (1 - tan(@angle)) * sin2(@angle)
86
+ end
87
+ end
88
+
89
+ def y
90
+ @y ||= if @angle < 0.0001
91
+ 1.0 # the limit of the expression as we approach 0 is 1.
92
+ else
93
+ x / tan(@angle)
94
+ end
95
+ end
96
+
97
+ def x1
98
+ result case @quadrant
99
+ when 0, 1
100
+ -x
101
+ when 2, 3
102
+ x
103
+ end
104
+ end
105
+
106
+ def y1
107
+ result case @quadrant
108
+ when 0, 3
109
+ y
110
+ when 1, 2
111
+ -y
112
+ end
113
+ end
114
+
115
+ def x2
116
+ result case @quadrant
117
+ when 0, 1
118
+ x
119
+ when 2, 3
120
+ -x
121
+ end
122
+ end
123
+
124
+ def y2
125
+ result case @quadrant
126
+ when 0, 3
127
+ -y
128
+ when 1, 2
129
+ y
130
+ end
131
+ end
132
+
133
+ def scale(p)
134
+ (p + 1) / 2.0
135
+ end
136
+
137
+ def round6(v)
138
+ (v * 1_000_000).round / 1_000_000.0
139
+ end
140
+
141
+ def result(v)
142
+ round6(scale(v))
143
+ end
144
+ end
145
+
5
146
  class ColorStop < Sass::Script::Value::Base
6
147
  include Sass::Script::Value::Helpers
7
148
  attr_accessor :color, :stop
@@ -94,11 +235,11 @@ module Compass::Core::SassExtensions::Functions::GradientSupport
94
235
 
95
236
  module ClassMethods
96
237
  def standardized_prefix(prefix)
97
- class_eval %Q{
238
+ class_eval %Q<
98
239
  def to_#{prefix}(options = self.options)
99
240
  identifier("-#{prefix}-\#{to_s_prefixed(options)}")
100
241
  end
101
- }
242
+ >
102
243
  end
103
244
  end
104
245
 
@@ -229,7 +370,7 @@ module Compass::Core::SassExtensions::Functions::GradientSupport
229
370
 
230
371
  def supports?(aspect)
231
372
  # I don't know how to support degree-based gradients in old webkit gradients (owg) or svg so we just disable them.
232
- if %w(owg svg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Value::Number) && position_or_angle.numerator_units.include?("deg")
373
+ if %w(owg).include?(aspect) && position_or_angle.is_a?(Sass::Script::Value::Number) && position_or_angle.numerator_units.include?("deg")
233
374
  false
234
375
  elsif aspect == "svg" && color_stops.value.any?{|cs| cs.stop.is_a?(Sass::Script::Value::String) }
235
376
  # calc expressions cannot be represented in svg
@@ -465,11 +606,10 @@ module Compass::Core::SassExtensions::Functions::GradientSupport
465
606
  end
466
607
 
467
608
  def linear_svg_gradient(color_stops, start)
468
- x1, y1 = *grad_point(start).value
469
- x2, y2 = *grad_point(opposite_position(start)).value
609
+ converter = CSS3AngleToSVGConverter.new(start)
470
610
  stops = color_stops_in_percentages(color_stops)
471
611
 
472
- svg = linear_svg(stops, x1, y1, x2, y2)
612
+ svg = linear_svg(stops, converter.x1, converter.y1, converter.x2, converter.y2)
473
613
  inline_image_string(svg.gsub(/\s+/, ' '), 'image/svg+xml')
474
614
  end
475
615
 
@@ -559,11 +699,7 @@ module Compass::Core::SassExtensions::Functions::GradientSupport
559
699
  end
560
700
 
561
701
  def linear_svg(color_stops, x1, y1, x2, y2)
562
- transform = ''
563
- if angle?(position_or_angle)
564
- transform = %Q{ gradientTransform = "rotate(#{position_or_angle.value})"}
565
- end
566
- gradient = %Q{<linearGradient id="grad" gradientUnits="userSpaceOnUse" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}"#{transform}>#{color_stops_svg(color_stops)}</linearGradient>}
702
+ gradient = %Q{<linearGradient id="grad" gradientUnits="objectBoundingBox" x1="#{x1}" y1="#{y1}" x2="#{x2}" y2="#{y2}">#{color_stops_svg(color_stops)}</linearGradient>}
567
703
  svg(gradient)
568
704
  end
569
705
 
@@ -2,7 +2,7 @@
2
2
  @import "compass/utilities/general/hacks";
3
3
 
4
4
  $gradient-support-threshold: $graceful-usage-threshold !default;
5
- $svg-gradient-shim-threshold: 10.0 !default;
5
+ $svg-gradient-shim-threshold: $graceful-usage-threshold !default;
6
6
  $border-image-support-threshold: $graceful-usage-threshold !default;
7
7
 
8
8
  // Compass assumes you will use the official gradient syntax,
@@ -56,6 +56,27 @@ $transitionable-prefixed-values: transform, transform-origin !default;
56
56
  }
57
57
  }
58
58
 
59
+ // Returns $transition-map which includes key and values that map to a transition declaration
60
+ @function transition-map($transition) {
61
+ $transition-map: ();
62
+
63
+ @each $item in $transition {
64
+ @if is-time($item) {
65
+ @if map-has-key($transition-map, duration) {
66
+ $transition-map: map-merge($transition-map, (delay: $item));
67
+ } @else {
68
+ $transition-map: map-merge($transition-map, (duration: $item));
69
+ }
70
+ } @else if map-has-key($transition-map, property) {
71
+ $transition-map: map-merge($transition-map, (timing-function: $item));
72
+ } @else {
73
+ $transition-map: map-merge($transition-map, (property: $item));
74
+ }
75
+ }
76
+
77
+ @return $transition-map;
78
+ }
79
+
59
80
  // One or more properties to transition
60
81
  //
61
82
  // * for multiple, use a comma-delimited list
@@ -133,20 +154,16 @@ $transitionable-prefixed-values: transform, transform-origin !default;
133
154
  // This block can be made considerably simpler at the point in time that
134
155
  // we no longer need to deal with the differences in how delays are treated.
135
156
  @each $transition in $transitions {
136
- // Extract the values from the list
137
- // (this would be cleaner if nth took a 3rd argument to provide a default value).
138
- $property: nth($transition, 1);
139
- $duration: if(length($transition) >= 2, nth($transition, 2), null);
140
- $timing-function: if(length($transition) >= 3, nth($transition, 3), null);
141
- $delay: if(length($transition) >= 4, nth($transition, 4), null);
142
- $has-delays: $has-delays or $delay;
157
+ // Declare initial values for transition
158
+ $transition: transition-map($transition);
143
159
 
144
- // If a delay is provided without a timing function
145
- @if is-time($timing-function) and not $delay {
146
- $delay: $timing-function;
147
- $timing-function: null;
148
- $has-delays: true;
149
- }
160
+ $property: map-get($transition, property);
161
+ $duration: map-get($transition, duration);
162
+ $timing-function: map-get($transition, timing-function);
163
+ $delay: map-get($transition, delay);
164
+
165
+ // Parse transition string to assign values into correct variables
166
+ $has-delays: $has-delays or $delay;
150
167
 
151
168
  @if $current-prefix == -webkit {
152
169
  // Keep a list of delays in case one is specified
@@ -5,8 +5,16 @@
5
5
  // a color. Brightness is sometimes called luminance.
6
6
  //
7
7
  // Returns a number between 0% and 100%, where 100% is fully bright
8
- // (white) and 0% is fully dark (black).
8
+ // (white) and 0% is fully dark (black) for color values.
9
+ //
10
+ // For numbers and percentages it returns the same value to be used
11
+ // in `@include filter(brightness(1.1))`.
9
12
  @function brightness($color) {
10
- @return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114)) / 255 * 100%;
13
+ @if type-of($color) == color {
14
+ @return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114)) / 255 * 100%;
15
+ }
16
+ @else {
17
+ @return unquote("brightness(#{$color})");
18
+ }
11
19
  }
12
20
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compass-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.20
4
+ version: 1.0.0.alpha.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Eppstein
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-06-27 00:00:00.000000000 Z
14
+ date: 2014-07-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: sass