doohickey 0.1.0
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.
- data/.gitignore +1 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +54 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/app/stylesheets/doohickey/_doohickey.sass +40 -0
- data/app/stylesheets/doohickey/_settings.sass +2 -0
- data/app/stylesheets/doohickey/accessibility/_accessible_image_links.sass +7 -0
- data/app/stylesheets/doohickey/css3/_awesome_button.sass +21 -0
- data/app/stylesheets/doohickey/css3/_border_radius.sass +37 -0
- data/app/stylesheets/doohickey/css3/_font_face.sass +6 -0
- data/app/stylesheets/doohickey/css3/_gradients.sass +5 -0
- data/app/stylesheets/doohickey/css3/_shadows.sass +7 -0
- data/app/stylesheets/doohickey/layout/_body.sass +15 -0
- data/app/stylesheets/doohickey/lists/_bullets.sass +9 -0
- data/app/stylesheets/doohickey/lists/_horizontal.sass +13 -0
- data/app/stylesheets/doohickey/tabs/_horizontal.sass +9 -0
- data/app/stylesheets/doohickey/utils/_clearfix.sass +3 -0
- data/app/stylesheets/doohickey/utils/_floats.sass +12 -0
- data/app/stylesheets/doohickey/utils/_hacks.sass +6 -0
- data/app/stylesheets/doohickey/utils/_reset.sass +80 -0
- data/doohickey.gemspec +70 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/lib/doohickey/sass_extensions/gradients.rb +212 -0
- data/lib/doohickey.rb +66 -0
- data/tasks/doohickey_tasks.rake +4 -0
- data/test/doohickey_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- data/uninstall.rb +1 -0
- metadata +92 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg/
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Trond Arve Nordheim
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Doohickey
|
2
|
+
A collection of [Sass][sass] mixins that I use in my projects.<br><br>
|
3
|
+
Partly based on and inspired by [Compass][compass].
|
4
|
+
|
5
|
+
# Installation
|
6
|
+
Install Doohickey as a plugin using:<br>
|
7
|
+
`script/plugin install http://github.com/tanordheim/doohickey.git`
|
8
|
+
|
9
|
+
Then you must create a initializer file in config/initializers/ containing the
|
10
|
+
following:<br>
|
11
|
+
`Doohickey::Initializer.initialize`
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
To import Doohickey into your Sass template, simply type:<br>
|
15
|
+
`@import doohickey/doohickey`
|
16
|
+
|
17
|
+
## Available mixins
|
18
|
+
|
19
|
+
### Accessibility mixins
|
20
|
+
* +accessible-image-link
|
21
|
+
|
22
|
+
### CSS3 mixins
|
23
|
+
* +awesome-button
|
24
|
+
* +border-radius, +border-top-radius, +border-bottom-radius, +border-top-left-radius, +border-top-right-radius, +border-bottom-left-radius, +border-bottom-right-radius, +border-corner-radius
|
25
|
+
* +font-face
|
26
|
+
* +linear-gradient
|
27
|
+
* +box-shadow
|
28
|
+
* +text-shadow
|
29
|
+
|
30
|
+
### Layout mixins
|
31
|
+
* +standard-body
|
32
|
+
|
33
|
+
### List mixins
|
34
|
+
* +no-bullet, +no-bullets
|
35
|
+
* +horizontal-list, +horizontal-list-container, +horizontal-list-item
|
36
|
+
|
37
|
+
### Tab mixins
|
38
|
+
* +horizontal-tabs
|
39
|
+
|
40
|
+
### Utility mixins
|
41
|
+
* +clearfix
|
42
|
+
* +float-left, +float-right, +float-reset
|
43
|
+
* +has-layout
|
44
|
+
* +global-reset
|
45
|
+
|
46
|
+
## Author
|
47
|
+
Written by Trond Arve Nordheim.<br>
|
48
|
+
Some code is borrowed from [Compass][compass] and written by Chris Eppstein.
|
49
|
+
|
50
|
+
## License
|
51
|
+
Released under the MIT license
|
52
|
+
|
53
|
+
[sass]: http://sass-lang.com/ "Syntactically Awesome Stylesheets"
|
54
|
+
[compass]: http://compass-style.org/
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/classic_namespace'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
desc 'Default: run unit tests.'
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
desc 'Test the doohickey plugin.'
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
11
|
+
t.libs << 'lib'
|
12
|
+
t.libs << 'test'
|
13
|
+
t.pattern = 'test/**/*_test.rb'
|
14
|
+
t.verbose = true
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'Generate documentation for the doohickey plugin.'
|
18
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
19
|
+
rdoc.rdoc_dir = 'rdoc'
|
20
|
+
rdoc.title = 'Doohickey'
|
21
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
22
|
+
rdoc.rdoc_files.include('README')
|
23
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
24
|
+
end
|
25
|
+
|
26
|
+
begin
|
27
|
+
require "jeweler"
|
28
|
+
Jeweler::Tasks.new do |gemspec|
|
29
|
+
gemspec.name = "doohickey"
|
30
|
+
gemspec.summary = "Easy to use SASS mixins for Rails projects"
|
31
|
+
gemspec.description = "Contains SASS mixins and a default SASS configuration for use in Ruby on Rails projects"
|
32
|
+
gemspec.email = "tanordheim@gmail.com"
|
33
|
+
gemspec.homepage = "http://github.com/tanordheim/doohickey"
|
34
|
+
gemspec.authors = ["Trond Arve Nordheim"]
|
35
|
+
end
|
36
|
+
Jeweler::GemcutterTasks.new
|
37
|
+
rescue LoadError
|
38
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
39
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,40 @@
|
|
1
|
+
@import doohickey/settings.sass
|
2
|
+
|
3
|
+
//
|
4
|
+
// Utility mixins
|
5
|
+
// ----------------------------------------------------------------------------
|
6
|
+
@import doohickey/utils/hacks.sass
|
7
|
+
@import doohickey/utils/clearfix.sass
|
8
|
+
@import doohickey/utils/reset.sass
|
9
|
+
@import doohickey/utils/floats.sass
|
10
|
+
|
11
|
+
//
|
12
|
+
// Body mixins
|
13
|
+
// ----------------------------------------------------------------------------
|
14
|
+
@import doohickey/layout/body.sass
|
15
|
+
|
16
|
+
//
|
17
|
+
// List mixins
|
18
|
+
// ----------------------------------------------------------------------------
|
19
|
+
@import doohickey/lists/bullets.sass
|
20
|
+
@import doohickey/lists/horizontal.sass
|
21
|
+
|
22
|
+
|
23
|
+
//
|
24
|
+
// Tabs mixins
|
25
|
+
// ----------------------------------------------------------------------------
|
26
|
+
@import doohickey/tabs/horizontal.sass
|
27
|
+
|
28
|
+
//
|
29
|
+
// Accessibility
|
30
|
+
// ----------------------------------------------------------------------------
|
31
|
+
@import doohickey/accessibility/accessible_image_links.sass
|
32
|
+
|
33
|
+
//
|
34
|
+
// CSS3 mixins
|
35
|
+
// ----------------------------------------------------------------------------
|
36
|
+
@import doohickey/css3/font_face.sass
|
37
|
+
@import doohickey/css3/gradients.sass
|
38
|
+
@import doohickey/css3/shadows.sass
|
39
|
+
@import doohickey/css3/border_radius.sass
|
40
|
+
@import doohickey/css3/awesome_button.sass
|
@@ -0,0 +1,21 @@
|
|
1
|
+
=awesome-button(!background_color, !text_color)
|
2
|
+
background= !background_color url("/images/button_overlay.png") "repeat-x"
|
3
|
+
display: inline-block
|
4
|
+
padding: 7px 10px 6px
|
5
|
+
color= !text_color
|
6
|
+
text-decoration: none
|
7
|
+
+border-radius(5px)
|
8
|
+
+box-shadow(rgba(0, 0, 0, 0.5), 0, 1px, 3px)
|
9
|
+
+text-shadow(rgba(0, 0, 0, 0.25), 0, -1px, 1px)
|
10
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.25)
|
11
|
+
position: relative
|
12
|
+
cursor: pointer
|
13
|
+
font-size: 1.1em
|
14
|
+
font-weight: bold
|
15
|
+
line-height: 1
|
16
|
+
|
17
|
+
&:hover
|
18
|
+
background-color= !background_color - #222
|
19
|
+
|
20
|
+
&:active
|
21
|
+
top: 1px
|
@@ -0,0 +1,37 @@
|
|
1
|
+
=border-radius(!radius)
|
2
|
+
border-radius= !radius
|
3
|
+
-moz-border-radius= !radius
|
4
|
+
-webkit-border-radius= !radius
|
5
|
+
|
6
|
+
=border-top-left-radius(!radius)
|
7
|
+
+border-corner-radius("top", "left", !radius)
|
8
|
+
|
9
|
+
=border-top-right-radius(!radius)
|
10
|
+
+border-corner-radius("top", "right", !radius)
|
11
|
+
|
12
|
+
=border-bottom-left-radius(!radius)
|
13
|
+
+border-corner-radius("bottom", "left", !radius)
|
14
|
+
|
15
|
+
=border-bottom-right-radius(!radius)
|
16
|
+
+border-corner-radius("bottom", "right", !radius)
|
17
|
+
|
18
|
+
=border-top-radius(!radius)
|
19
|
+
+border-top-left-radius(!radius)
|
20
|
+
+border-top-right-radius(!radius)
|
21
|
+
|
22
|
+
=border-bottom-radius(!radius)
|
23
|
+
+border-bottom-left-radius(!radius)
|
24
|
+
+border-bottom-right-radius(!radius)
|
25
|
+
|
26
|
+
=border-left-radius(!radius)
|
27
|
+
+border-top-left-radius(!radius)
|
28
|
+
+border-bottom-left-radius(!radius)
|
29
|
+
|
30
|
+
=border-right-radius(!radius)
|
31
|
+
+border-top-right-radius(!radius)
|
32
|
+
+border-bottom-right-radius(!radius)
|
33
|
+
|
34
|
+
=border-corner-radius(!vertical, !horizontal, !radius)
|
35
|
+
border-#{!vertical}-#{!horizontal}-radius= !radius
|
36
|
+
-moz-border-radius-#{!vertical}#{!horizontal}= !radius
|
37
|
+
-webkit-border-#{!vertical}#{!horizontal}= !radius
|
@@ -0,0 +1,5 @@
|
|
1
|
+
=linear-gradient(!color_stops, !start = "top")
|
2
|
+
!end = grad_opposite_position(!start)
|
3
|
+
background-color: #{first_color_stop(!color_stops)}
|
4
|
+
background-image: -webkit-gradient(linear, #{grad_point(!start)}, #{grad_point(!end)}, #{grad_color_stops(!color_stops)})
|
5
|
+
background-image: -moz-linear-gradient(#{!start}, #{!color_stops})
|
@@ -0,0 +1,7 @@
|
|
1
|
+
=box-shadow(!color, !horizontal_offset, !vertical_offset, !spread)
|
2
|
+
-webkit-box-shadow= !color !horizontal_offset !vertical_offset !spread
|
3
|
+
-moz-box-shadow= !color !horizontal_offset !vertical_offset !spread
|
4
|
+
box-shadow= !color !horizontal_offset !vertical_offset !spread
|
5
|
+
|
6
|
+
=text-shadow(!color, !horizontal_offset, !vertical_offset, !spread)
|
7
|
+
text-shadow= !horizontal_offset !vertical_offset !spread !color
|
@@ -0,0 +1,15 @@
|
|
1
|
+
=standard-body(!font_family = "Arial, sans-serif", !background = false, !color = false, !font_size = false, !line_height = false)
|
2
|
+
body
|
3
|
+
font-family= !font_family
|
4
|
+
@if !font_size
|
5
|
+
font-size= !font_size
|
6
|
+
@else
|
7
|
+
font-size: 62.5%
|
8
|
+
@if !line_height
|
9
|
+
line-height= !line_height
|
10
|
+
@else
|
11
|
+
line-height: 1.5em
|
12
|
+
@if !background
|
13
|
+
background= !background
|
14
|
+
@if !color
|
15
|
+
color= !color
|
@@ -0,0 +1,80 @@
|
|
1
|
+
=global-reset
|
2
|
+
html, body, div, span, applet, object, iframe,
|
3
|
+
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
4
|
+
a, abbr, acronym, address, big, cite, code,
|
5
|
+
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
6
|
+
small, strike, strong, sub, sup, tt, var,
|
7
|
+
dl, dt, dd, ol, ul, li,
|
8
|
+
fieldset, form, label, legend, button,
|
9
|
+
table, caption, tbody, tfoot, thead, tr, th, td
|
10
|
+
+reset-box-model
|
11
|
+
+reset-font
|
12
|
+
|
13
|
+
*:focus
|
14
|
+
+reset-focus
|
15
|
+
|
16
|
+
body
|
17
|
+
+reset-body
|
18
|
+
|
19
|
+
ol, ul, li
|
20
|
+
+reset-list-style
|
21
|
+
|
22
|
+
/* tables still need 'cellspacing="0"' in the markup
|
23
|
+
table
|
24
|
+
+reset-table
|
25
|
+
|
26
|
+
caption, th, td
|
27
|
+
+reset-table-cell
|
28
|
+
|
29
|
+
q, blockquote
|
30
|
+
+reset-quotation
|
31
|
+
|
32
|
+
a img
|
33
|
+
+reset-image-anchor-border
|
34
|
+
|
35
|
+
=reset-box-model
|
36
|
+
margin: 0
|
37
|
+
padding: 0
|
38
|
+
border: 0
|
39
|
+
outline: 0
|
40
|
+
|
41
|
+
=reset-font
|
42
|
+
font:
|
43
|
+
weight: inherit
|
44
|
+
style: inherit
|
45
|
+
size: 100%
|
46
|
+
family: inherit
|
47
|
+
vertical-align: baseline
|
48
|
+
|
49
|
+
=reset-focus
|
50
|
+
outline: 0
|
51
|
+
|
52
|
+
=reset-body
|
53
|
+
line-height: 1
|
54
|
+
color: #000
|
55
|
+
background: #fff
|
56
|
+
|
57
|
+
=reset-list-style
|
58
|
+
list-style: none
|
59
|
+
|
60
|
+
=reset-table
|
61
|
+
border-collapse: separate
|
62
|
+
border-spacing: 0
|
63
|
+
vertical-align: middle
|
64
|
+
|
65
|
+
=reset-table-cell
|
66
|
+
text-align: left
|
67
|
+
font-weight: normal
|
68
|
+
vertical-align: middle
|
69
|
+
|
70
|
+
=reset-quotation
|
71
|
+
quotes: "" ""
|
72
|
+
&:before, &:after
|
73
|
+
content: ""
|
74
|
+
|
75
|
+
=reset-image-anchor-border
|
76
|
+
border: none
|
77
|
+
|
78
|
+
=reset-html5
|
79
|
+
section, article, aside, header, footer, nav, dialog, figure
|
80
|
+
display: block
|
data/doohickey.gemspec
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{doohickey}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Trond Arve Nordheim"]
|
12
|
+
s.date = %q{2010-05-26}
|
13
|
+
s.description = %q{Contains SASS mixins and a default SASS configuration for use in Ruby on Rails projects}
|
14
|
+
s.email = %q{tanordheim@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"MIT-LICENSE",
|
21
|
+
"README.markdown",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"app/stylesheets/doohickey/_doohickey.sass",
|
25
|
+
"app/stylesheets/doohickey/_settings.sass",
|
26
|
+
"app/stylesheets/doohickey/accessibility/_accessible_image_links.sass",
|
27
|
+
"app/stylesheets/doohickey/css3/_awesome_button.sass",
|
28
|
+
"app/stylesheets/doohickey/css3/_border_radius.sass",
|
29
|
+
"app/stylesheets/doohickey/css3/_font_face.sass",
|
30
|
+
"app/stylesheets/doohickey/css3/_gradients.sass",
|
31
|
+
"app/stylesheets/doohickey/css3/_shadows.sass",
|
32
|
+
"app/stylesheets/doohickey/layout/_body.sass",
|
33
|
+
"app/stylesheets/doohickey/lists/_bullets.sass",
|
34
|
+
"app/stylesheets/doohickey/lists/_horizontal.sass",
|
35
|
+
"app/stylesheets/doohickey/tabs/_horizontal.sass",
|
36
|
+
"app/stylesheets/doohickey/utils/_clearfix.sass",
|
37
|
+
"app/stylesheets/doohickey/utils/_floats.sass",
|
38
|
+
"app/stylesheets/doohickey/utils/_hacks.sass",
|
39
|
+
"app/stylesheets/doohickey/utils/_reset.sass",
|
40
|
+
"doohickey.gemspec",
|
41
|
+
"init.rb",
|
42
|
+
"install.rb",
|
43
|
+
"lib/doohickey.rb",
|
44
|
+
"lib/doohickey/sass_extensions/gradients.rb",
|
45
|
+
"tasks/doohickey_tasks.rake",
|
46
|
+
"test/doohickey_test.rb",
|
47
|
+
"test/test_helper.rb",
|
48
|
+
"uninstall.rb"
|
49
|
+
]
|
50
|
+
s.homepage = %q{http://github.com/tanordheim/doohickey}
|
51
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
52
|
+
s.require_paths = ["lib"]
|
53
|
+
s.rubygems_version = %q{1.3.6}
|
54
|
+
s.summary = %q{Easy to use SASS mixins for Rails projects}
|
55
|
+
s.test_files = [
|
56
|
+
"test/test_helper.rb",
|
57
|
+
"test/doohickey_test.rb"
|
58
|
+
]
|
59
|
+
|
60
|
+
if s.respond_to? :specification_version then
|
61
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
62
|
+
s.specification_version = 3
|
63
|
+
|
64
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
65
|
+
else
|
66
|
+
end
|
67
|
+
else
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "doohickey"
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
@@ -0,0 +1,212 @@
|
|
1
|
+
#
|
2
|
+
# This class is copied from the Compass CSS framework
|
3
|
+
# <http://compass-style.org/>
|
4
|
+
#
|
5
|
+
# All credits go to Chris Eppstein
|
6
|
+
#
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
module Doohickey
|
9
|
+
module SassExtensions
|
10
|
+
module Gradients
|
11
|
+
|
12
|
+
class List < Sass::Script::Literal
|
13
|
+
attr_accessor :values
|
14
|
+
def initialize(*values)
|
15
|
+
self.values = values
|
16
|
+
end
|
17
|
+
def inspect
|
18
|
+
values.map{|v| v.inspect}.join(", ")
|
19
|
+
end
|
20
|
+
def to_s
|
21
|
+
inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ColorStop < Sass::Script::Literal
|
26
|
+
attr_accessor :color, :stop
|
27
|
+
def initialize(color, stop = nil)
|
28
|
+
self.color, self.stop = color, stop
|
29
|
+
end
|
30
|
+
def inspect
|
31
|
+
to_s
|
32
|
+
end
|
33
|
+
def to_s
|
34
|
+
s = color.inspect.dup
|
35
|
+
if stop
|
36
|
+
s << " "
|
37
|
+
if stop.unitless?
|
38
|
+
s << stop.times(Sass::Script::Number.new(100, ["%"])).inspect
|
39
|
+
else
|
40
|
+
s << stop.inspect
|
41
|
+
end
|
42
|
+
end
|
43
|
+
s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Functions
|
48
|
+
# returns the opposite position of a side or corner.
|
49
|
+
def grad_opposite_position(position)
|
50
|
+
opposite = position.value.split(/ +/).map do |pos|
|
51
|
+
case pos
|
52
|
+
when "top" then "bottom"
|
53
|
+
when "bottom" then "top"
|
54
|
+
when "left" then "right"
|
55
|
+
when "right" then "left"
|
56
|
+
when "center" then "center"
|
57
|
+
else
|
58
|
+
raise Sass::SyntaxError, "Cannot determine the opposite of #{pos}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
Sass::Script::String.new(opposite.join(" "))
|
62
|
+
end
|
63
|
+
|
64
|
+
# Return the color of the first color stop
|
65
|
+
def first_color_stop(color_list)
|
66
|
+
color = color_list.values.first.color.inspect
|
67
|
+
Sass::Script::String.new(color)
|
68
|
+
end
|
69
|
+
|
70
|
+
# returns color-stop() calls for use in webkit.
|
71
|
+
def grad_color_stops(color_list)
|
72
|
+
assert_list(color_list)
|
73
|
+
normalize_stops!(color_list)
|
74
|
+
max = color_list.values.last.stop
|
75
|
+
color_stops = color_list.values.map do |pos|
|
76
|
+
# have to convert absolute units to percentages for use in color stop functions.
|
77
|
+
stop = pos.stop
|
78
|
+
stop = stop.div(max).times(Sass::Script::Number.new(100,["%"])) if stop.numerator_units == max.numerator_units
|
79
|
+
"color-stop(#{stop.inspect}, #{pos.color.inspect})"
|
80
|
+
end
|
81
|
+
Sass::Script::String.new(color_stops.join(", "))
|
82
|
+
end
|
83
|
+
|
84
|
+
# returns the end position of the gradient from the color stop
|
85
|
+
def grad_end_position(color_list, radial = Sass::Script::Bool.new(false))
|
86
|
+
assert_list(color_list)
|
87
|
+
default = Sass::Script::Number.new(100)
|
88
|
+
grad_position(color_list, Sass::Script::Number.new(color_list.values.size), default, radial)
|
89
|
+
end
|
90
|
+
|
91
|
+
def grad_position(color_list, index, default, radial = Sass::Script::Bool.new(false))
|
92
|
+
assert_list(color_list)
|
93
|
+
stop = color_list.values[index.value - 1].stop
|
94
|
+
if stop && radial.to_bool
|
95
|
+
orig_stop = stop
|
96
|
+
if stop.unitless?
|
97
|
+
if stop.value <= 1
|
98
|
+
# A unitless number is assumed to be a percentage when it's between 0 and 1
|
99
|
+
stop = stop.times(Sass::Script::Number.new(100, ["%"]))
|
100
|
+
else
|
101
|
+
# Otherwise, a unitless number is assumed to be in pixels
|
102
|
+
stop = stop.times(Sass::Script::Number.new(1, ["px"]))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
if stop.numerator_units == ["%"] && color_list.values.last.stop && color_list.values.last.stop.numerator_units == ["px"]
|
106
|
+
stop = stop.times(color_list.values.last.stop).div(Sass::Script::Number.new(100, ["%"]))
|
107
|
+
end
|
108
|
+
stop.div(Sass::Script::Number.new(1, stop.numerator_units, stop.denominator_units))
|
109
|
+
elsif stop
|
110
|
+
stop
|
111
|
+
else
|
112
|
+
default
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# the given a position, return a point in percents
|
117
|
+
def grad_point(position)
|
118
|
+
position = position.value
|
119
|
+
position = if position[" "]
|
120
|
+
if position =~ /(top|bottom|center) (left|right|center)/
|
121
|
+
"#{$2} #{$1}"
|
122
|
+
else
|
123
|
+
position
|
124
|
+
end
|
125
|
+
else
|
126
|
+
case position
|
127
|
+
when /top|bottom/
|
128
|
+
"left #{position}"
|
129
|
+
when /left|right/
|
130
|
+
"#{position} top"
|
131
|
+
else
|
132
|
+
position
|
133
|
+
end
|
134
|
+
end
|
135
|
+
Sass::Script::String.new(position.
|
136
|
+
gsub(/top/, "0%").
|
137
|
+
gsub(/bottom/, "100%").
|
138
|
+
gsub(/left/,"0%").
|
139
|
+
gsub(/right/,"100%").
|
140
|
+
gsub(/center/, "50%"))
|
141
|
+
end
|
142
|
+
|
143
|
+
def color_stops(*args)
|
144
|
+
List.new(*args.map do |arg|
|
145
|
+
case arg
|
146
|
+
when Sass::Script::Color
|
147
|
+
ColorStop.new(arg)
|
148
|
+
when Sass::Script::String
|
149
|
+
# We get a string as the result of concatenation
|
150
|
+
# So we have to reparse the expression
|
151
|
+
color = stop = nil
|
152
|
+
expr = Sass::Script::Parser.parse(arg.value, 0, 0)
|
153
|
+
case expr
|
154
|
+
when Sass::Script::Color
|
155
|
+
color = expr
|
156
|
+
when Sass::Script::Funcall
|
157
|
+
color = expr
|
158
|
+
when Sass::Script::Operation
|
159
|
+
unless expr.instance_variable_get("@operator") == :concat
|
160
|
+
# This should never happen.
|
161
|
+
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
162
|
+
end
|
163
|
+
color = expr.instance_variable_get("@operand1")
|
164
|
+
stop = expr.instance_variable_get("@operand2")
|
165
|
+
else
|
166
|
+
raise Sass::SyntaxError, "Couldn't parse a color stop from: #{arg.value}"
|
167
|
+
end
|
168
|
+
ColorStop.new(color, stop)
|
169
|
+
else
|
170
|
+
raise Sass::SyntaxError, "Not a valid color stop: #{arg}"
|
171
|
+
end
|
172
|
+
end)
|
173
|
+
end
|
174
|
+
private
|
175
|
+
def normalize_stops!(color_list)
|
176
|
+
positions = color_list.values
|
177
|
+
# fill in the start and end positions, if unspecified
|
178
|
+
positions.first.stop = Sass::Script::Number.new(0) unless positions.first.stop
|
179
|
+
positions.last.stop = Sass::Script::Number.new(100, ["%"]) unless positions.last.stop
|
180
|
+
# fill in empty values
|
181
|
+
for i in 0...positions.size
|
182
|
+
if positions[i].stop.nil?
|
183
|
+
num = 2.0
|
184
|
+
for j in (i+1)...positions.size
|
185
|
+
if positions[j].stop
|
186
|
+
positions[i].stop = positions[i-1].stop.plus((positions[j].stop.minus(positions[i-1].stop)).div(Sass::Script::Number.new(num)))
|
187
|
+
break
|
188
|
+
else
|
189
|
+
num += 1
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
# normalize unitless numbers
|
195
|
+
positions.each do |pos|
|
196
|
+
if pos.stop.unitless? && pos.stop.value <= 1
|
197
|
+
pos.stop = pos.stop.times(Sass::Script::Number.new(100, ["%"]))
|
198
|
+
elsif pos.stop.unitless?
|
199
|
+
pos.stop = pos.stop.times(Sass::Script::Number.new(1, ["px"]))
|
200
|
+
end
|
201
|
+
end
|
202
|
+
nil
|
203
|
+
end
|
204
|
+
def assert_list(value)
|
205
|
+
return if value.is_a?(List)
|
206
|
+
raise ArgumentError.new("#{value.inspect} is not a list of color stops. Expected: color_stops(<color> <number>?, ...)")
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/lib/doohickey.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Require that sass is available
|
2
|
+
require "sass"
|
3
|
+
|
4
|
+
# Define our namespace
|
5
|
+
module Doohickey
|
6
|
+
module SassExtensions
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Load the Sass functionality extensions
|
11
|
+
%w(gradients).each do |function|
|
12
|
+
require "doohickey/sass_extensions/#{function}"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Define the Doohickey initializer
|
16
|
+
module Doohickey
|
17
|
+
class Initializer
|
18
|
+
|
19
|
+
def self.rails_root
|
20
|
+
defined?(Rails.root) ? Rails.root : RAILS_ROOT
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.rails_env
|
24
|
+
defined?(Rails.env) ? Rails.env : RAILS_ENV
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.initialize
|
28
|
+
|
29
|
+
# Global Sass settings
|
30
|
+
# -----------------------------------------------------------------------------
|
31
|
+
template_locations = {}
|
32
|
+
template_locations["#{rails_root}/app/stylesheets"] = Sass::Plugin.options[:css_location]
|
33
|
+
template_locations[File.join(File.dirname(__FILE__), *%w[.. app stylesheets])] = Sass::Plugin.options[:css_location]
|
34
|
+
|
35
|
+
Sass::Plugin.options[:template_location] = template_locations
|
36
|
+
|
37
|
+
# Environment specific configurations
|
38
|
+
# -----------------------------------------------------------------------------
|
39
|
+
if %w(production staging).include?(rails_env)
|
40
|
+
|
41
|
+
# Compress CSS (small files suitable for production)
|
42
|
+
Sass::Plugin.options[:style] = :compressed
|
43
|
+
|
44
|
+
else
|
45
|
+
|
46
|
+
# Expand CSS
|
47
|
+
Sass::Plugin.options[:style] = :expanded
|
48
|
+
|
49
|
+
# Generate CSS from SASS every time a controller is accessed
|
50
|
+
Sass::Plugin.options[:always_update] = true
|
51
|
+
|
52
|
+
# Insert comments in the CSS about the line numbers of the Sass source
|
53
|
+
Sass::Plugin.options[:line_comments] = true
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
# Include the Sass functionality extensions
|
58
|
+
Sass::Script::Functions.send :include, Doohickey::SassExtensions::Gradients::Functions
|
59
|
+
|
60
|
+
# This has to be re-included to pick up submodules
|
61
|
+
Sass::Script::Functions::EvaluationContext.send :include, Sass::Script::Functions
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
data/test/test_helper.rb
ADDED
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: doohickey
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Trond Arve Nordheim
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-26 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Contains SASS mixins and a default SASS configuration for use in Ruby on Rails projects
|
22
|
+
email: tanordheim@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- README.markdown
|
29
|
+
files:
|
30
|
+
- .gitignore
|
31
|
+
- MIT-LICENSE
|
32
|
+
- README.markdown
|
33
|
+
- Rakefile
|
34
|
+
- VERSION
|
35
|
+
- app/stylesheets/doohickey/_doohickey.sass
|
36
|
+
- app/stylesheets/doohickey/_settings.sass
|
37
|
+
- app/stylesheets/doohickey/accessibility/_accessible_image_links.sass
|
38
|
+
- app/stylesheets/doohickey/css3/_awesome_button.sass
|
39
|
+
- app/stylesheets/doohickey/css3/_border_radius.sass
|
40
|
+
- app/stylesheets/doohickey/css3/_font_face.sass
|
41
|
+
- app/stylesheets/doohickey/css3/_gradients.sass
|
42
|
+
- app/stylesheets/doohickey/css3/_shadows.sass
|
43
|
+
- app/stylesheets/doohickey/layout/_body.sass
|
44
|
+
- app/stylesheets/doohickey/lists/_bullets.sass
|
45
|
+
- app/stylesheets/doohickey/lists/_horizontal.sass
|
46
|
+
- app/stylesheets/doohickey/tabs/_horizontal.sass
|
47
|
+
- app/stylesheets/doohickey/utils/_clearfix.sass
|
48
|
+
- app/stylesheets/doohickey/utils/_floats.sass
|
49
|
+
- app/stylesheets/doohickey/utils/_hacks.sass
|
50
|
+
- app/stylesheets/doohickey/utils/_reset.sass
|
51
|
+
- doohickey.gemspec
|
52
|
+
- init.rb
|
53
|
+
- install.rb
|
54
|
+
- lib/doohickey.rb
|
55
|
+
- lib/doohickey/sass_extensions/gradients.rb
|
56
|
+
- tasks/doohickey_tasks.rake
|
57
|
+
- test/doohickey_test.rb
|
58
|
+
- test/test_helper.rb
|
59
|
+
- uninstall.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/tanordheim/doohickey
|
62
|
+
licenses: []
|
63
|
+
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options:
|
66
|
+
- --charset=UTF-8
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.6
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Easy to use SASS mixins for Rails projects
|
90
|
+
test_files:
|
91
|
+
- test/test_helper.rb
|
92
|
+
- test/doohickey_test.rb
|