compass-core 1.0.0.alpha.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/VERSION +1 -0
  4. data/data/caniuse.json +1 -0
  5. data/data/caniuse_extras/css-placeholder.json +171 -0
  6. data/lib/compass-core.rb +1 -0
  7. data/lib/compass/browser_support.rb +62 -0
  8. data/lib/compass/configuration.rb +168 -0
  9. data/lib/compass/configuration/data.rb +178 -0
  10. data/lib/compass/configuration/defaults.rb +197 -0
  11. data/lib/compass/configuration/inheritance.rb +304 -0
  12. data/lib/compass/configuration/paths.rb +19 -0
  13. data/lib/compass/core.rb +64 -0
  14. data/lib/compass/core/caniuse.rb +282 -0
  15. data/lib/compass/core/sass_extensions.rb +10 -0
  16. data/lib/compass/core/sass_extensions/functions.rb +39 -0
  17. data/lib/compass/core/sass_extensions/functions/colors.rb +67 -0
  18. data/lib/compass/core/sass_extensions/functions/configuration.rb +162 -0
  19. data/lib/compass/core/sass_extensions/functions/constants.rb +74 -0
  20. data/lib/compass/core/sass_extensions/functions/cross_browser_support.rb +269 -0
  21. data/lib/compass/core/sass_extensions/functions/display.rb +32 -0
  22. data/lib/compass/core/sass_extensions/functions/enumerate.rb +7 -0
  23. data/lib/compass/core/sass_extensions/functions/env.rb +60 -0
  24. data/lib/compass/core/sass_extensions/functions/font_files.rb +41 -0
  25. data/lib/compass/core/sass_extensions/functions/gradient_support.rb +616 -0
  26. data/lib/compass/core/sass_extensions/functions/image_size.rb +117 -0
  27. data/lib/compass/core/sass_extensions/functions/inline_image.rb +64 -0
  28. data/lib/compass/core/sass_extensions/functions/lists.rb +101 -0
  29. data/lib/compass/core/sass_extensions/functions/math.rb +92 -0
  30. data/lib/compass/core/sass_extensions/functions/selectors.rb +64 -0
  31. data/lib/compass/core/sass_extensions/functions/urls.rb +297 -0
  32. data/lib/compass/core/sass_extensions/monkey_patches.rb +3 -0
  33. data/lib/compass/core/sass_extensions/monkey_patches/browser_support.rb +118 -0
  34. data/lib/compass/core/sass_extensions/monkey_patches/traversal.rb +23 -0
  35. data/lib/compass/core/version.rb +5 -0
  36. data/lib/compass/error.rb +5 -0
  37. data/stylesheets/_compass.scss +3 -0
  38. data/stylesheets/_lemonade.scss +38 -0
  39. data/stylesheets/compass/_configuration.scss +54 -0
  40. data/stylesheets/compass/_css3.scss +21 -0
  41. data/stylesheets/compass/_layout.scss +3 -0
  42. data/stylesheets/compass/_reset-legacy.scss +3 -0
  43. data/stylesheets/compass/_reset.scss +3 -0
  44. data/stylesheets/compass/_support.scss +441 -0
  45. data/stylesheets/compass/_typography.scss +4 -0
  46. data/stylesheets/compass/_utilities.scss +9 -0
  47. data/stylesheets/compass/css3/_animation.scss +122 -0
  48. data/stylesheets/compass/css3/_appearance.scss +17 -0
  49. data/stylesheets/compass/css3/_background-clip.scss +35 -0
  50. data/stylesheets/compass/css3/_background-origin.scss +37 -0
  51. data/stylesheets/compass/css3/_background-size.scss +19 -0
  52. data/stylesheets/compass/css3/_border-radius.scss +107 -0
  53. data/stylesheets/compass/css3/_box-shadow.scss +88 -0
  54. data/stylesheets/compass/css3/_box-sizing.scss +15 -0
  55. data/stylesheets/compass/css3/_box.scss +85 -0
  56. data/stylesheets/compass/css3/_columns.scss +210 -0
  57. data/stylesheets/compass/css3/_deprecated-support.scss +272 -0
  58. data/stylesheets/compass/css3/_filter.scss +50 -0
  59. data/stylesheets/compass/css3/_flexbox.scss +156 -0
  60. data/stylesheets/compass/css3/_font-face.scss +48 -0
  61. data/stylesheets/compass/css3/_hyphenation.scss +71 -0
  62. data/stylesheets/compass/css3/_images.scss +139 -0
  63. data/stylesheets/compass/css3/_inline-block.scss +31 -0
  64. data/stylesheets/compass/css3/_opacity.scss +23 -0
  65. data/stylesheets/compass/css3/_pie.scss +1 -0
  66. data/stylesheets/compass/css3/_regions.scss +27 -0
  67. data/stylesheets/compass/css3/_selection.scss +59 -0
  68. data/stylesheets/compass/css3/_shared.scss +5 -0
  69. data/stylesheets/compass/css3/_text-shadow.scss +82 -0
  70. data/stylesheets/compass/css3/_transform.scss +590 -0
  71. data/stylesheets/compass/css3/_transition.scss +171 -0
  72. data/stylesheets/compass/css3/_user-interface.scss +71 -0
  73. data/stylesheets/compass/layout/_grid-background.scss +178 -0
  74. data/stylesheets/compass/layout/_sticky-footer.scss +23 -0
  75. data/stylesheets/compass/layout/_stretching.scss +24 -0
  76. data/stylesheets/compass/reset/_utilities-legacy.scss +135 -0
  77. data/stylesheets/compass/reset/_utilities.scss +142 -0
  78. data/stylesheets/compass/typography/_links.scss +3 -0
  79. data/stylesheets/compass/typography/_lists.scss +4 -0
  80. data/stylesheets/compass/typography/_text.scss +4 -0
  81. data/stylesheets/compass/typography/_units.scss +152 -0
  82. data/stylesheets/compass/typography/_vertical_rhythm.scss +300 -0
  83. data/stylesheets/compass/typography/links/_hover-link.scss +5 -0
  84. data/stylesheets/compass/typography/links/_link-colors.scss +28 -0
  85. data/stylesheets/compass/typography/links/_unstyled-link.scss +7 -0
  86. data/stylesheets/compass/typography/lists/_bullets.scss +34 -0
  87. data/stylesheets/compass/typography/lists/_horizontal-list.scss +63 -0
  88. data/stylesheets/compass/typography/lists/_inline-block-list.scss +50 -0
  89. data/stylesheets/compass/typography/lists/_inline-list.scss +47 -0
  90. data/stylesheets/compass/typography/text/_ellipsis.scss +25 -0
  91. data/stylesheets/compass/typography/text/_force-wrap.scss +12 -0
  92. data/stylesheets/compass/typography/text/_nowrap.scss +2 -0
  93. data/stylesheets/compass/typography/text/_replacement.scss +68 -0
  94. data/stylesheets/compass/utilities/_color.scss +1 -0
  95. data/stylesheets/compass/utilities/_general.scss +6 -0
  96. data/stylesheets/compass/utilities/_links.scss +5 -0
  97. data/stylesheets/compass/utilities/_lists.scss +6 -0
  98. data/stylesheets/compass/utilities/_print.scss +17 -0
  99. data/stylesheets/compass/utilities/_sass.scss +2 -0
  100. data/stylesheets/compass/utilities/_sprites.scss +2 -0
  101. data/stylesheets/compass/utilities/_tables.scss +3 -0
  102. data/stylesheets/compass/utilities/_text.scss +5 -0
  103. data/stylesheets/compass/utilities/color/_brightness.scss +12 -0
  104. data/stylesheets/compass/utilities/color/_contrast.scss +52 -0
  105. data/stylesheets/compass/utilities/general/_clearfix.scss +44 -0
  106. data/stylesheets/compass/utilities/general/_float.scss +38 -0
  107. data/stylesheets/compass/utilities/general/_hacks.scss +65 -0
  108. data/stylesheets/compass/utilities/general/_min.scss +16 -0
  109. data/stylesheets/compass/utilities/general/_reset.scss +2 -0
  110. data/stylesheets/compass/utilities/general/_tabs.scss +1 -0
  111. data/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -0
  112. data/stylesheets/compass/utilities/links/_hover-link.scss +3 -0
  113. data/stylesheets/compass/utilities/links/_link-colors.scss +3 -0
  114. data/stylesheets/compass/utilities/links/_unstyled-link.scss +3 -0
  115. data/stylesheets/compass/utilities/lists/_bullets.scss +3 -0
  116. data/stylesheets/compass/utilities/lists/_horizontal-list.scss +3 -0
  117. data/stylesheets/compass/utilities/lists/_inline-block-list.scss +3 -0
  118. data/stylesheets/compass/utilities/lists/_inline-list.scss +3 -0
  119. data/stylesheets/compass/utilities/sass/_lists.scss +16 -0
  120. data/stylesheets/compass/utilities/sass/_maps.scss +19 -0
  121. data/stylesheets/compass/utilities/sprites/_base.scss +92 -0
  122. data/stylesheets/compass/utilities/sprites/_sprite-img.scss +81 -0
  123. data/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +22 -0
  124. data/stylesheets/compass/utilities/tables/_borders.scss +38 -0
  125. data/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -0
  126. data/stylesheets/compass/utilities/text/_ellipsis.scss +3 -0
  127. data/stylesheets/compass/utilities/text/_nowrap.scss +3 -0
  128. data/stylesheets/compass/utilities/text/_replacement.scss +3 -0
  129. data/templates/ellipsis/ellipsis.sass +9 -0
  130. data/templates/ellipsis/manifest.rb +27 -0
  131. data/templates/ellipsis/xml/ellipsis.xml +14 -0
  132. data/templates/extension/manifest.rb +26 -0
  133. data/templates/extension/stylesheets/main.sass +1 -0
  134. data/templates/extension/templates/project/manifest.rb +2 -0
  135. data/templates/extension/templates/project/screen.sass +2 -0
  136. data/templates/project/USAGE.markdown +32 -0
  137. data/templates/project/ie.sass +6 -0
  138. data/templates/project/manifest.rb +4 -0
  139. data/templates/project/print.sass +6 -0
  140. data/templates/project/screen.sass +7 -0
  141. metadata +241 -0
@@ -0,0 +1,135 @@
1
+ // Based on [Eric Meyer's reset](http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/)
2
+ // Global reset rules.
3
+ // For more specific resets, use the reset mixins provided below
4
+ //
5
+ // *Please Note*: tables still need `cellspacing="0"` in the markup.
6
+ @mixin global-reset {
7
+ html, body, div, span, applet, object, iframe,
8
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
9
+ a, abbr, acronym, address, big, cite, code,
10
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
11
+ small, strike, strong, sub, sup, tt, var,
12
+ dl, dt, dd, ol, ul, li,
13
+ fieldset, form, label, legend,
14
+ table, caption, tbody, tfoot, thead, tr, th, td {
15
+ @include reset-box-model;
16
+ @include reset-font; }
17
+ body {
18
+ @include reset-body; }
19
+ ol, ul {
20
+ @include reset-list-style; }
21
+ table {
22
+ @include reset-table; }
23
+ caption, th, td {
24
+ @include reset-table-cell; }
25
+ q, blockquote {
26
+ @include reset-quotation; }
27
+ a img {
28
+ @include reset-image-anchor-border; } }
29
+
30
+ // Reset all elements within some selector scope. To reset the selector itself,
31
+ // mixin the appropriate reset mixin for that element type as well. This could be
32
+ // useful if you want to style a part of your page in a dramatically different way.
33
+ //
34
+ // *Please Note*: tables still need `cellspacing="0"` in the markup.
35
+ @mixin nested-reset {
36
+ div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
37
+ pre, a, abbr, acronym, address, code, del, dfn, em, img,
38
+ dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr {
39
+ @include reset-box-model;
40
+ @include reset-font; }
41
+ table {
42
+ @include reset-table; }
43
+ caption, th, td {
44
+ @include reset-table-cell; }
45
+ q, blockquote {
46
+ @include reset-quotation; }
47
+ a img {
48
+ @include reset-image-anchor-border; } }
49
+
50
+ // Reset the box model measurements.
51
+ @mixin reset-box-model {
52
+ margin: 0;
53
+ padding: 0;
54
+ border: 0;
55
+ outline: 0; }
56
+
57
+ // Reset the font and vertical alignment.
58
+ @mixin reset-font {
59
+ font: {
60
+ weight: inherit;
61
+ style: inherit;
62
+ size: 100%;
63
+ family: inherit; };
64
+ vertical-align: baseline; }
65
+
66
+ // Resets the outline when focus.
67
+ // For accessibility you need to apply some styling in its place.
68
+ @mixin reset-focus {
69
+ outline: 0; }
70
+
71
+ // Reset a body element.
72
+ @mixin reset-body {
73
+ line-height: 1;
74
+ color: black;
75
+ background: white; }
76
+
77
+ // Reset the list style of an element.
78
+ @mixin reset-list-style {
79
+ list-style: none; }
80
+
81
+ // Reset a table
82
+ @mixin reset-table {
83
+ border-collapse: separate;
84
+ border-spacing: 0;
85
+ vertical-align: middle; }
86
+
87
+ // Reset a table cell (`th`, `td`)
88
+ @mixin reset-table-cell {
89
+ text-align: left;
90
+ font-weight: normal;
91
+ vertical-align: middle; }
92
+
93
+ // Reset a quotation (`q`, `blockquote`)
94
+ @mixin reset-quotation {
95
+ quotes: "" "";
96
+ &:before, &:after {
97
+ content: ""; } }
98
+
99
+ // Resets the border.
100
+ @mixin reset-image-anchor-border {
101
+ border: none; }
102
+
103
+ // Unrecognized elements are displayed inline.
104
+ // This reset provides a basic reset for html5 elements
105
+ // so they are rendered correctly in browsers that don't recognize them
106
+ // and reset in browsers that have default styles for them.
107
+ @mixin reset-html5 {
108
+ #{elements-of-type(html5-block)} {
109
+ @include reset-box-model;
110
+ display: block; } }
111
+
112
+ // Resets the display of inline and block elements to their default display
113
+ // according to their tag type. Elements that have a default display that varies across
114
+ // versions of html or browser are not handled here, but this covers the 90% use case.
115
+ // Usage Example:
116
+ //
117
+ // // Turn off the display for both of these classes
118
+ // .unregistered-only, .registered-only
119
+ // display: none
120
+ // // Now turn only one of them back on depending on some other context.
121
+ // body.registered
122
+ // +reset-display(".registered-only")
123
+ // body.unregistered
124
+ // +reset-display(".unregistered-only")
125
+ @mixin reset-display($selector: "", $important: false) {
126
+ #{append-selector(elements-of-type("inline"), $selector)} {
127
+ @if $important {
128
+ display: inline !important; }
129
+ @else {
130
+ display: inline; } }
131
+ #{append-selector(elements-of-type("block"), $selector)} {
132
+ @if $important {
133
+ display: block !important; }
134
+ @else {
135
+ display: block; } } }
@@ -0,0 +1,142 @@
1
+ // Based on [Eric Meyer's reset 2.0](http://meyerweb.com/eric/tools/css/reset/index.html)
2
+ // Global reset rules.
3
+ // For more specific resets, use the reset mixins provided below
4
+ @mixin global-reset {
5
+ html, body, div, span, applet, object, iframe,
6
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
7
+ a, abbr, acronym, address, big, cite, code,
8
+ del, dfn, em, img, ins, kbd, q, s, samp,
9
+ small, strike, strong, sub, sup, tt, var,
10
+ b, u, i, center,
11
+ dl, dt, dd, ol, ul, li,
12
+ fieldset, form, label, legend,
13
+ table, caption, tbody, tfoot, thead, tr, th, td,
14
+ article, aside, canvas, details, embed,
15
+ figure, figcaption, footer, header, hgroup,
16
+ menu, nav, output, ruby, section, summary,
17
+ time, mark, audio, video {
18
+ @include reset-box-model;
19
+ @include reset-font; }
20
+ // Unlike Eric's original reset, we reset the html element to be compatible
21
+ // with the vertical rhythm mixins.
22
+ html {
23
+ @include reset-body; }
24
+ ol, ul {
25
+ @include reset-list-style; }
26
+ table {
27
+ @include reset-table; }
28
+ caption, th, td {
29
+ @include reset-table-cell; }
30
+ q, blockquote {
31
+ @include reset-quotation; }
32
+ a img {
33
+ @include reset-image-anchor-border; }
34
+ @include reset-html5; }
35
+
36
+ // Reset all elements within some selector scope. To reset the selector itself,
37
+ // mixin the appropriate reset mixin for that element type as well. This could be
38
+ // useful if you want to style a part of your page in a dramatically different way.
39
+ @mixin nested-reset {
40
+ div, span, applet, object, iframe,
41
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
42
+ a, abbr, acronym, address, big, cite, code,
43
+ del, dfn, em, img, ins, kbd, q, s, samp,
44
+ small, strike, strong, sub, sup, tt, var,
45
+ b, u, i, center,
46
+ dl, dt, dd, ol, ul, li,
47
+ fieldset, form, label, legend,
48
+ table, caption, tbody, tfoot, thead, tr, th, td,
49
+ article, aside, canvas, details, embed,
50
+ figure, figcaption, footer, header, hgroup,
51
+ menu, nav, output, ruby, section, summary,
52
+ time, mark, audio, video {
53
+ @include reset-box-model;
54
+ @include reset-font; }
55
+ table {
56
+ @include reset-table; }
57
+ caption, th, td {
58
+ @include reset-table-cell; }
59
+ q, blockquote {
60
+ @include reset-quotation; }
61
+ a img {
62
+ @include reset-image-anchor-border; } }
63
+
64
+ // Reset the box model measurements.
65
+ @mixin reset-box-model {
66
+ margin: 0;
67
+ padding: 0;
68
+ border: 0; }
69
+
70
+ // Reset the font and vertical alignment.
71
+ @mixin reset-font {
72
+ font: inherit;
73
+ font-size: 100%;
74
+ vertical-align: baseline; }
75
+
76
+ // Resets the outline when focus.
77
+ // For accessibility you need to apply some styling in its place.
78
+ @mixin reset-focus {
79
+ outline: 0; }
80
+
81
+ // Reset a body element.
82
+ @mixin reset-body {
83
+ line-height: 1; }
84
+
85
+ // Reset the list style of an element.
86
+ @mixin reset-list-style {
87
+ list-style: none; }
88
+
89
+ // Reset a table
90
+ @mixin reset-table {
91
+ border-collapse: collapse;
92
+ border-spacing: 0; }
93
+
94
+ // Reset a table cell (`th`, `td`)
95
+ @mixin reset-table-cell {
96
+ text-align: left;
97
+ font-weight: normal;
98
+ vertical-align: middle; }
99
+
100
+ // Reset a quotation (`q`, `blockquote`)
101
+ @mixin reset-quotation {
102
+ quotes: none;
103
+ &:before, &:after {
104
+ content: "";
105
+ content: none; } }
106
+
107
+ // Resets the border.
108
+ @mixin reset-image-anchor-border {
109
+ border: none; }
110
+
111
+ // Unrecognized elements are displayed inline.
112
+ // This reset provides a basic reset for block html5 elements
113
+ // so they are rendered correctly in browsers that don't recognize them
114
+ // and reset in browsers that have default styles for them.
115
+ @mixin reset-html5 {
116
+ #{elements-of-type(html5-block)} {
117
+ display: block; } }
118
+
119
+ // Resets the display of inline and block elements to their default display
120
+ // according to their tag type. Elements that have a default display that varies across
121
+ // versions of html or browser are not handled here, but this covers the 90% use case.
122
+ // Usage Example:
123
+ //
124
+ // // Turn off the display for both of these classes
125
+ // .unregistered-only, .registered-only
126
+ // display: none
127
+ // // Now turn only one of them back on depending on some other context.
128
+ // body.registered
129
+ // +reset-display(".registered-only")
130
+ // body.unregistered
131
+ // +reset-display(".unregistered-only")
132
+ @mixin reset-display($selector: "", $important: false) {
133
+ #{append-selector(elements-of-type("inline"), $selector)} {
134
+ @if $important {
135
+ display: inline !important; }
136
+ @else {
137
+ display: inline; } }
138
+ #{append-selector(elements-of-type("block"), $selector)} {
139
+ @if $important {
140
+ display: block !important; }
141
+ @else {
142
+ display: block; } } }
@@ -0,0 +1,3 @@
1
+ @import "links/hover-link";
2
+ @import "links/link-colors";
3
+ @import "links/unstyled-link";
@@ -0,0 +1,4 @@
1
+ @import "lists/horizontal-list";
2
+ @import "lists/inline-list";
3
+ @import "lists/inline-block-list";
4
+ @import "lists/bullets";
@@ -0,0 +1,4 @@
1
+ @import "text/ellipsis";
2
+ @import "text/nowrap";
3
+ @import "text/replacement";
4
+ @import "text/force-wrap";
@@ -0,0 +1,152 @@
1
+ // @private Default font-size for all browsers
2
+ $browser-default-font-size: 16px;
3
+
4
+ // Base font size in pixels, if not already defined.
5
+ // Should be the same as the font-size of the html element.
6
+ $base-font-size: 16px !default;
7
+
8
+ // Whether to output fallback values in px when outputting rems.
9
+ $rem-with-px-fallback: true !default;
10
+
11
+
12
+ // Convert any CSS <length> or <percentage> value to any another.
13
+ //
14
+ // @param $length
15
+ // A css <length> or <percentage> value
16
+ //
17
+ // @param $to-unit
18
+ // String matching a css unit keyword, e.g. 'em', '%', etc.
19
+ //
20
+ // @param $from-context
21
+ // When converting from relative units, the absolute length (in px) to
22
+ // which $length refers (e.g. for $lengths in em units, would normally be the
23
+ // font-size of the current element).
24
+ //
25
+ // @param $to-context
26
+ // For converting to relative units, the absolute length in px to which the
27
+ // output value will refer. Defaults to the same as $from-context, since it is
28
+ // rarely needed.
29
+ @function convert-length(
30
+ $length,
31
+ $to-unit,
32
+ $from-context: $base-font-size,
33
+ $to-context: $from-context
34
+ ) {
35
+
36
+ $from-unit: unit($length);
37
+
38
+ // Optimize for cases where `from` and `to` units are accidentally the same.
39
+ @if $from-unit == $to-unit { @return $length; }
40
+
41
+ // Context values must be in px so we can determine a conversion ratio for
42
+ // relative units.
43
+ @if unit($from-context) != 'px' { @warn "Paremeter $from-context must resolve to a value in pixel units."; }
44
+ @if unit($to-context) != 'px' { @warn "Parameter $to-context must resolve to a value in pixel units."; }
45
+
46
+ // Convert input length to pixels
47
+ $px-length: $length;
48
+
49
+ @if $from-unit != 'px' {
50
+ // Convert relative units using the from-context parameter.
51
+ @if $from-unit == 'em' { $px-length: $length * $from-context / 1em }
52
+ @else if $from-unit == 'rem' { $px-length: $length * $base-font-size / 1rem }
53
+ @else if $from-unit == '%' { $px-length: $length * $from-context / 100% }
54
+ @else if $from-unit == 'ex' { $px-length: $length * $from-context / 2ex }
55
+ // Convert absolute units using Sass' conversion table.
56
+ @else if $from-unit == 'in' or
57
+ $from-unit == 'mm' or
58
+ $from-unit == 'cm' or
59
+ $from-unit == 'pt' or
60
+ $from-unit == 'pc' { $px-length: 0px + $length }
61
+ // Certain units can't be converted.
62
+ @else if $from-unit == 'ch' or
63
+ $from-unit == 'vw' or
64
+ $from-unit == 'vh' or
65
+ $from-unit == 'vmin' {
66
+ @warn "#{$from-unit} units can't be reliably converted; Returning original value.";
67
+ @return $length;
68
+ }
69
+ @else {
70
+ @warn "#{$from-unit} is an unknown length unit. Returning original value.";
71
+ @return $length;
72
+ }
73
+ }
74
+
75
+ // Convert length in pixels to the output unit
76
+ $output-length: $px-length;
77
+ @if $to-unit != 'px' {
78
+ // Relative units
79
+ @if $to-unit == 'em' { $output-length: $px-length * 1em / $to-context }
80
+ @else if $to-unit == 'rem' { $output-length: $px-length * 1rem / $base-font-size }
81
+ @else if $to-unit == '%' { $output-length: $px-length * 100% / $to-context }
82
+ @else if $to-unit == 'ex' { $output-length: $px-length * 2ex / $to-context }
83
+ // Absolute units
84
+ @else if $to-unit == 'in' { $output-length: 0in + $px-length }
85
+ @else if $to-unit == 'mm' { $output-length: 0mm + $px-length }
86
+ @else if $to-unit == 'cm' { $output-length: 0cm + $px-length }
87
+ @else if $to-unit == 'pt' { $output-length: 0pt + $px-length }
88
+ @else if $to-unit == 'pc' { $output-length: 0pc + $px-length }
89
+ // Non-convertible units
90
+ @else if $to-unit == 'ch' or
91
+ $to-unit == 'vw' or
92
+ $to-unit == 'vh' or
93
+ $to-unit == 'vmin' {
94
+ @warn "#{$to-unit} units can't be reliably converted; Returning original value.";
95
+ @return $length;
96
+ }
97
+ @else {
98
+ @warn "#{$to-unit} is an unknown length unit. Returning original value.";
99
+ @return $length;
100
+ }
101
+ }
102
+
103
+ @return $output-length;
104
+ }
105
+
106
+
107
+ // Output a given style rule containing rem values along with an (optional)
108
+ // fallback rule for older browsers (with rem values converted to px).
109
+ //
110
+ // @param $property
111
+ // The css property name.
112
+ //
113
+ // @param $values
114
+ // The value (or space-separated list of values) for the property.
115
+ //
116
+ // @param $use-px-fallback
117
+ // [ true | false ]
118
+ //
119
+ @mixin rem($property, $values, $use-px-fallback: $rem-with-px-fallback) {
120
+ // Create a couple of empty lists as output buffers.
121
+ $px-values: ();
122
+ $rem-values: ();
123
+
124
+ // Loop through the $values list
125
+ @each $value in $values {
126
+ // For each property value, if it's in rem or px, derive both rem and
127
+ // px values for it and add those to the end of the appropriate buffer.
128
+ // Ensure all pixel values are rounded to the nearest pixel.
129
+ @if type-of($value) == number and not unitless($value) and (unit($value) == px or unit($value) == rem) {
130
+ @if unit($value) == px {
131
+ $px-values: join($px-values, round($value));
132
+ $rem-values: join($rem-values, convert-length($value, rem));
133
+ }
134
+ @else {
135
+ $px-values: join($px-values, round(convert-length($value, px)));
136
+ $rem-values: join($rem-values, $value);
137
+ }
138
+ }
139
+ @else {
140
+ $px-values: join($px-values, $value);
141
+ $rem-values: join($rem-values, $value);
142
+ }
143
+ }
144
+
145
+ // Use pixel fallback for browsers that don't understand rem units.
146
+ @if $use-px-fallback {
147
+ #{$property}: $px-values;
148
+ }
149
+
150
+ // Use rem values for everyone else (overrides pixel values).
151
+ #{$property}: $rem-values;
152
+ }
@@ -0,0 +1,300 @@
1
+ @import "compass/support";
2
+ @import "compass/layout/grid-background";
3
+ @import "compass/typography/units";
4
+
5
+ // The default font size for all text in pixels
6
+ $base-font-size: 16px !default;
7
+
8
+ // The distance between text baselines (vertical rhythm) in pixels.
9
+ $base-line-height: 24px !default;
10
+
11
+ // The length unit in which to output rhythm values.
12
+ // Supported values: px, em, rem. Percent units can't be used since they
13
+ // make calculating padding and margins impractical, and percentage borders are
14
+ // not valid or supported in css.
15
+ $rhythm-unit: 'em' !default;
16
+
17
+ // Whether to output fallback values in px when using rem as the rhythm-unit.
18
+ $rem-with-px-fallback: true !default;
19
+
20
+ // Default values for rhythm borders properties.
21
+ // Supports style alone eg. `solid` or list of style and color eg. `solid #aaa`;
22
+ $default-rhythm-border-width: 1px !default;
23
+ $default-rhythm-border-style: solid !default;
24
+
25
+ // Allows the `adjust-font-size-to` mixin and the `lines-for-font-size` function
26
+ // to round the line height to the nearest half line height instead of the
27
+ // nearest integral line height to avoid large spacing between lines.
28
+ $round-to-nearest-half-line: false !default;
29
+
30
+ // Ensure there is at least this many pixels
31
+ // of vertical padding above and below the text.
32
+ $min-line-padding: 2px !default;
33
+
34
+ // The leader is the amount of whitespace in a line.
35
+ // It might be useful in your calculations.
36
+ $base-leader: convert-length($base-line-height - $base-font-size, $rhythm-unit, $base-font-size);
37
+
38
+ // The half-leader is the amount of whitespace above and below a line.
39
+ // It might be useful in your calculations.
40
+ $base-half-leader: $base-leader / 2;
41
+
42
+ // @private Whether the rhythm output is in absolute units (px) or not (em, rem)
43
+ $relative-font-sizing: if($rhythm-unit == px, false, true);
44
+
45
+ // Validate units
46
+ @if unit($base-font-size) != 'px' { @warn "$base-font-size must resolve to a pixel unit."; }
47
+ @if unit($base-line-height) != 'px' { @warn "$base-line-height must resolve to a pixel unit."; }
48
+ @if $rhythm-unit != 'px' and $rhythm-unit != 'em' and $rhythm-unit != 'rem' {
49
+ @warn "$rhythm-unit must be `px`, `em` or `rem`.";
50
+ }
51
+
52
+
53
+ // Calculate rhythm units.
54
+ @function rhythm($lines: 1, $font-size: $base-font-size, $offset: 0) {
55
+ $rhythm: convert-length($lines * $base-line-height - $offset, $rhythm-unit, $font-size);
56
+ @if unit($rhythm) == px {
57
+ $rhythm: floor($rhythm);
58
+ }
59
+ @return $rhythm;
60
+ }
61
+
62
+ // Calculate the minimum multiple of rhythm units needed to contain the font-size.
63
+ @function lines-for-font-size($font-size) {
64
+ $lines: if($round-to-nearest-half-line,
65
+ ceil(2 * $font-size / $base-line-height) / 2,
66
+ ceil($font-size / $base-line-height));
67
+ // If lines are cramped include some extra lead.
68
+ @if ($lines * $base-line-height - $font-size) < ($min-line-padding * 2) {
69
+ $lines: $lines + if($round-to-nearest-half-line, 0.5, 1);
70
+ }
71
+ @return $lines;
72
+ }
73
+
74
+
75
+ // @private Outputs rhythm values. For rem units, outputs pixel fallbacks
76
+ // by default.
77
+ @mixin output-rhythm($property, $values) {
78
+ @if $rhythm-unit == rem and $rem-with-px-fallback {
79
+ @include rem($property, $values);
80
+ }
81
+ @else {
82
+ $output: ();
83
+ @each $value in $values {
84
+ @if unit($value) == px {
85
+ // Ensure all pixel values are rounded to the nearest pixel.
86
+ $output: join($output, round($value));
87
+ }
88
+ @else {
89
+ $output: join($output, $value);
90
+ }
91
+ }
92
+ #{$property}: $output;
93
+ }
94
+ }
95
+
96
+ // Establishes a font baseline for the given font-size.
97
+ @mixin establish-baseline($font-size: $base-font-size) {
98
+ $relative-size: 100% * ($font-size / $browser-default-font-size);
99
+
100
+ @if support-legacy-browser(ie, "6") and (not $relative-font-sizing) {
101
+ // IE 6 refuses to resize fonts set in pixels and it weirdly resizes fonts
102
+ // whose root is set in ems. So we set the root font size in percentages of
103
+ // the default font size, even if we are using absolute sizes elsewhere.
104
+ * html { font-size: $relative-size; }
105
+ }
106
+ html {
107
+ font-size: if($relative-font-sizing, $relative-size, $font-size);
108
+
109
+ // Webkit has a bug that prevents line-height being set in rem on <html>;
110
+ // To work around this and simplify output, we can set initial line-height
111
+ // in ems for all relative rhythm units, even when $rhythm-unit is `rem`.
112
+ @if $relative-font-sizing {
113
+ line-height: convert-length($base-line-height, em);
114
+ }
115
+ @else {
116
+ line-height: round($base-line-height);
117
+ }
118
+ }
119
+ }
120
+
121
+ // Resets the baseline to 1 rhythm unit
122
+ // Does not work on elements whose font-size is different from $base-font-size.
123
+ //
124
+ // @deprecated This mixin will be removed in the next release.
125
+ // Please use `adjust-leading-to(1)` instead.
126
+ @mixin reset-baseline($font-size: $base-font-size) {
127
+ @include adjust-leading-to(1, $font-size);
128
+ }
129
+
130
+ // Show a background image that can be used to debug your alignments.
131
+ // As this is a development feature, this mixin never outputs pixel fallbacks
132
+ // for rem output.
133
+ // Include the $img argument if you would rather use your own image than the
134
+ // Compass default gradient image.
135
+ @mixin debug-vertical-alignment($img: false) {
136
+ @if $img {
137
+ background: image-url($img);
138
+ }
139
+ @else {
140
+ @include baseline-grid-background(rhythm());
141
+ }
142
+ }
143
+
144
+ // Adjust a block to have a different font size and line height to maintain the
145
+ // rhythm. $lines specifies how many multiples of the baseline rhythm each line
146
+ // of this font should use up. It does not have to be an integer, but it
147
+ // defaults to the smallest integer that is large enough to fit the font.
148
+ // Use $from-size to adjust from a font-size other than the base font-size.
149
+ @mixin adjust-font-size-to($to-size, $lines: auto, $from-size: $base-font-size) {
150
+ $to-size: convert-length($to-size, px, $from-size);
151
+ @if $lines == auto {
152
+ $lines: lines-for-font-size($to-size);
153
+ }
154
+ @include output-rhythm(font-size, convert-length($to-size, $rhythm-unit, $from-size));
155
+ @include adjust-leading-to($lines, $to-size);
156
+ }
157
+
158
+ // Adjust a block to have different line height to maintain the rhythm.
159
+ // $lines specifies how many multiples of the baseline rhythm each line of this
160
+ // font should use up. It does not have to be an integer, but it defaults to the
161
+ // smallest integer that is large enough to fit the font.
162
+ @mixin adjust-leading-to($lines, $font-size: $base-font-size) {
163
+ @include output-rhythm(line-height, rhythm($lines, $font-size));
164
+ }
165
+
166
+ // Apply leading whitespace. The $property can be margin or padding.
167
+ @mixin leader($lines: 1, $font-size: $base-font-size, $property: margin) {
168
+ @include output-rhythm(#{$property}-top, rhythm($lines, $font-size));
169
+ }
170
+
171
+ // Apply leading whitespace as padding.
172
+ @mixin padding-leader($lines: 1, $font-size: $base-font-size) {
173
+ @include output-rhythm(padding-top, rhythm($lines, $font-size));
174
+ }
175
+
176
+ // Apply leading whitespace as margin.
177
+ @mixin margin-leader($lines: 1, $font-size: $base-font-size) {
178
+ @include output-rhythm(margin-top, rhythm($lines, $font-size));
179
+ }
180
+
181
+ // Apply trailing whitespace. The $property can be margin or padding.
182
+ @mixin trailer($lines: 1, $font-size: $base-font-size, $property: margin) {
183
+ @include output-rhythm(#{$property}-bottom, rhythm($lines, $font-size));
184
+ }
185
+
186
+ // Apply trailing whitespace as padding.
187
+ @mixin padding-trailer($lines: 1, $font-size: $base-font-size) {
188
+ @include output-rhythm(padding-bottom, rhythm($lines, $font-size));
189
+ }
190
+
191
+ // Apply trailing whitespace as margin.
192
+ @mixin margin-trailer($lines: 1, $font-size: $base-font-size) {
193
+ @include output-rhythm(margin-bottom, rhythm($lines, $font-size));
194
+ }
195
+
196
+ // Shorthand mixin to apply whitespace for top and bottom margins and padding.
197
+ @mixin rhythm(
198
+ $leader: 1,
199
+ $padding-leader: 0,
200
+ $padding-trailer: $padding-leader,
201
+ $trailer: $leader,
202
+ $font-size: $base-font-size
203
+ ) {
204
+ @include leader($leader, $font-size);
205
+ @include padding-leader($padding-leader, $font-size);
206
+ @include padding-trailer($padding-trailer, $font-size);
207
+ @include trailer($trailer, $font-size);
208
+ }
209
+
210
+ // Shorthand mixin to apply whitespace for top and bottom margins.
211
+ @mixin rhythm-margins(
212
+ $leader: 1,
213
+ $trailer: $leader,
214
+ $font-size: $base-font-size
215
+ ) {
216
+ @include leader($leader, $font-size);
217
+ @include trailer($trailer, $font-size);
218
+ }
219
+
220
+ // Shorthand mixin to apply whitespace for top and bottom padding.
221
+ @mixin rhythm-padding(
222
+ $padding-leader: 1,
223
+ $padding-trailer: $padding-leader,
224
+ $font-size: $base-font-size
225
+ ) {
226
+ @include padding-leader($padding-leader, $font-size);
227
+ @include padding-trailer($padding-trailer, $font-size);
228
+ }
229
+
230
+ // Apply a border and whitespace to any side without destroying the vertical
231
+ // rhythm. The whitespace must be greater than the width of the border.
232
+ @mixin apply-side-rhythm-border(
233
+ $side,
234
+ $width: $default-rhythm-border-width,
235
+ $lines: 1,
236
+ $font-size: $base-font-size,
237
+ $border-style: $default-rhythm-border-style
238
+ ) {
239
+ // If applying borders to all sides, use shorthand properties
240
+ $border-prop: if($side == all, border, border-#{$side});
241
+ @include output-rhythm(#{$border-prop}-width, convert-length($width, $rhythm-unit, $font-size));
242
+ #{$border-prop}-style: nth($border-style, 1);
243
+ @if type-of($border-style) == list and length($border-style) > 1 {
244
+ #{$border-prop}-color: nth($border-style, 2);
245
+ }
246
+ $padding-prop: if($side == all, padding, padding-#{$side});
247
+ @include output-rhythm(#{$padding-prop}, rhythm($lines, $font-size, $offset: $width));
248
+ }
249
+
250
+ // Apply a leading border.
251
+ // $border-style and $width are deprecated and will be removed in a future version of Compass.
252
+ @mixin leading-border(
253
+ $width: $default-rhythm-border-width,
254
+ $lines: 1,
255
+ $font-size: $base-font-size,
256
+ $border-style: $default-rhythm-border-style
257
+ ) {
258
+ @include apply-side-rhythm-border(top, $width, $lines, $font-size, $border-style);
259
+ }
260
+
261
+ // Apply a trailing border.
262
+ @mixin trailing-border(
263
+ $width: $default-rhythm-border-width,
264
+ $lines: 1,
265
+ $font-size: $base-font-size,
266
+ $border-style: $default-rhythm-border-style
267
+ ) {
268
+ @include apply-side-rhythm-border(bottom, $width, $lines, $font-size, $border-style);
269
+ }
270
+
271
+ // Apply both leading and trailing borders.
272
+ @mixin horizontal-borders(
273
+ $width: $default-rhythm-border-width,
274
+ $lines: 1,
275
+ $font-size: $base-font-size,
276
+ $border-style: $default-rhythm-border-style
277
+ ) {
278
+ @include leading-border($width, $lines, $font-size, $border-style);
279
+ @include trailing-border($width, $lines, $font-size, $border-style);
280
+ }
281
+
282
+ // Alias for `horizontal-borders` mixin.
283
+ @mixin h-borders(
284
+ $width: $default-rhythm-border-width,
285
+ $lines: 1,
286
+ $font-size: $base-font-size,
287
+ $border-style: $default-rhythm-border-style
288
+ ) {
289
+ @include horizontal-borders($width, $lines, $font-size, $border-style);
290
+ }
291
+
292
+ // Apply borders and whitespace equally to all sides.
293
+ @mixin rhythm-borders(
294
+ $width: $default-rhythm-border-width,
295
+ $lines: 1,
296
+ $font-size: $base-font-size,
297
+ $border-style: $default-rhythm-border-style
298
+ ) {
299
+ @include apply-side-rhythm-border(all, $width, $lines, $font-size, $border-style);
300
+ }