bookends 0.6.0 → 2.0.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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/README.md +28 -24
  4. data/Rakefile +7 -3
  5. data/bin/bookends +5 -0
  6. data/bookends.gemspec +5 -2
  7. data/fixtures/dummy-jekyll/README.md +64 -0
  8. data/fixtures/dummy-jekyll/_config.yml +8 -0
  9. data/fixtures/dummy-jekyll/_layouts/default.html +118 -0
  10. data/fixtures/dummy-jekyll/_layouts/post.html +14 -0
  11. data/fixtures/dummy-jekyll/_sass/_base.scss +478 -0
  12. data/fixtures/dummy-jekyll/_sass/_google-cse.scss +372 -0
  13. data/fixtures/dummy-jekyll/_sass/_header.scss +780 -0
  14. data/fixtures/dummy-jekyll/_sass/_legacy.scss +567 -0
  15. data/fixtures/dummy-jekyll/_sass/_menu-icon.scss +68 -0
  16. data/fixtures/dummy-jekyll/_sass/_mixins.scss +12 -0
  17. data/fixtures/dummy-jekyll/_sass/_search.scss +51 -0
  18. data/{lib/generators/bookends/install/templates/footer.scss → fixtures/dummy-jekyll/_sass/bookends/_footer.scss} +0 -0
  19. data/fixtures/dummy-jekyll/_sass/mixins/_background-image.scss +48 -0
  20. data/fixtures/dummy-jekyll/_sass/mixins/_border-radius.scss +22 -0
  21. data/fixtures/dummy-jekyll/_sass/mixins/_box-sizing.scss +4 -0
  22. data/fixtures/dummy-jekyll/_sass/mixins/_hide-text.scss +5 -0
  23. data/fixtures/dummy-jekyll/_sass/mixins/_hidpi.scss +10 -0
  24. data/fixtures/dummy-jekyll/_sass/mixins/_linear-gradient.scss +41 -0
  25. data/fixtures/dummy-jekyll/_sass/mixins/_prefixer.scss +49 -0
  26. data/fixtures/dummy-jekyll/_sass/mixins/_responsiveness.scss +129 -0
  27. data/fixtures/dummy-jekyll/_sass/mixins/_retina-image.scss +31 -0
  28. data/fixtures/dummy-jekyll/_sass/mixins/_size.scss +44 -0
  29. data/fixtures/dummy-jekyll/_sass/mixins/_transition.scss +34 -0
  30. data/fixtures/dummy-jekyll/_sass/mixins/_triangle.scss +45 -0
  31. data/fixtures/dummy-jekyll/app.json +15 -0
  32. data/fixtures/dummy-jekyll/bin/from-gdoc +3 -0
  33. data/fixtures/dummy-jekyll/bin/platform-setup +15 -0
  34. data/fixtures/dummy-jekyll/feed.xml +34 -0
  35. data/fixtures/dummy-jekyll/index.html +40 -0
  36. data/fixtures/dummy-jekyll/static.json +3 -0
  37. data/fixtures/dummy-rails/README.md +9 -0
  38. data/fixtures/dummy-rails/Rakefile +6 -0
  39. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-book.eot +0 -0
  40. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-book.svg +400 -0
  41. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-book.ttf +0 -0
  42. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-book.woff +0 -0
  43. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-medium.eot +0 -0
  44. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-medium.svg +416 -0
  45. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-medium.ttf +0 -0
  46. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-medium.woff +0 -0
  47. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-regular.eot +0 -0
  48. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-regular.svg +416 -0
  49. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-regular.ttf +0 -0
  50. data/fixtures/dummy-rails/app/assets/fonts/bentonsans-regular.woff +0 -0
  51. data/fixtures/dummy-rails/app/assets/images/.keep +0 -0
  52. data/{lib/generators/bookends/install/templates/footer_images → fixtures/dummy-rails/app/assets/images/bookends/footer}/footer_sprite.png +0 -0
  53. data/{lib/generators/bookends/install/templates/footer_images → fixtures/dummy-rails/app/assets/images/bookends/footer}/footer_sprite@2x.png +0 -0
  54. data/{lib/generators/bookends/install/templates/footer_images → fixtures/dummy-rails/app/assets/images/bookends/footer}/salesforce_heroku_gray.png +0 -0
  55. data/fixtures/dummy-rails/app/assets/javascripts/application.js +15 -0
  56. data/fixtures/dummy-rails/app/assets/stylesheets/application.css.scss +11 -0
  57. data/fixtures/dummy-rails/app/controllers/application_controller.rb +5 -0
  58. data/fixtures/dummy-rails/app/controllers/concerns/.keep +0 -0
  59. data/fixtures/dummy-rails/app/controllers/pages_controller.rb +5 -0
  60. data/fixtures/dummy-rails/app/helpers/application_helper.rb +2 -0
  61. data/fixtures/dummy-rails/app/mailers/.keep +0 -0
  62. data/fixtures/dummy-rails/app/models/.keep +0 -0
  63. data/fixtures/dummy-rails/app/models/concerns/.keep +0 -0
  64. data/fixtures/dummy-rails/app/views/layouts/application.html.erb +16 -0
  65. data/fixtures/dummy-rails/app/views/pages/home.html.erb +1 -0
  66. data/fixtures/dummy-rails/bin/bundle +3 -0
  67. data/fixtures/dummy-rails/bin/rails +4 -0
  68. data/fixtures/dummy-rails/bin/rake +4 -0
  69. data/fixtures/dummy-rails/bin/setup +29 -0
  70. data/fixtures/dummy-rails/config/application.rb +34 -0
  71. data/fixtures/dummy-rails/config/boot.rb +5 -0
  72. data/fixtures/dummy-rails/config/database.yml +25 -0
  73. data/fixtures/dummy-rails/config/environment.rb +5 -0
  74. data/fixtures/dummy-rails/config/environments/development.rb +41 -0
  75. data/fixtures/dummy-rails/config/environments/production.rb +79 -0
  76. data/fixtures/dummy-rails/config/environments/test.rb +42 -0
  77. data/fixtures/dummy-rails/config/initializers/assets.rb +11 -0
  78. data/fixtures/dummy-rails/config/initializers/backtrace_silencers.rb +7 -0
  79. data/fixtures/dummy-rails/config/initializers/cookies_serializer.rb +3 -0
  80. data/fixtures/dummy-rails/config/initializers/filter_parameter_logging.rb +4 -0
  81. data/fixtures/dummy-rails/config/initializers/inflections.rb +16 -0
  82. data/fixtures/dummy-rails/config/initializers/mime_types.rb +4 -0
  83. data/fixtures/dummy-rails/config/initializers/session_store.rb +3 -0
  84. data/fixtures/dummy-rails/config/initializers/wrap_parameters.rb +14 -0
  85. data/fixtures/dummy-rails/config/locales/en.yml +23 -0
  86. data/fixtures/dummy-rails/config/routes.rb +6 -0
  87. data/fixtures/dummy-rails/config/secrets.yml +22 -0
  88. data/fixtures/dummy-rails/config.ru +4 -0
  89. data/fixtures/dummy-rails/db/development.sqlite3 +0 -0
  90. data/fixtures/dummy-rails/lib/assets/.keep +0 -0
  91. data/fixtures/dummy-rails/log/.keep +0 -0
  92. data/fixtures/dummy-rails/log/development.log +1893 -0
  93. data/fixtures/dummy-rails/public/404.html +67 -0
  94. data/fixtures/dummy-rails/public/422.html +67 -0
  95. data/fixtures/dummy-rails/public/500.html +66 -0
  96. data/fixtures/dummy-rails/public/favicon.ico +0 -0
  97. data/lib/bookends/cli.rb +88 -0
  98. data/lib/bookends/config/framework.rb +24 -0
  99. data/lib/bookends/config/turbolinks.rb +18 -0
  100. data/lib/bookends/file_actions.rb +13 -0
  101. data/lib/bookends/jekyll_handler.rb +21 -0
  102. data/lib/bookends/rails_handler.rb +30 -0
  103. data/lib/{generators/bookends/install/templates/footer.html.erb → bookends/templates/footer.html} +18 -18
  104. data/lib/bookends/templates/footer.scss +403 -0
  105. data/lib/bookends/templates/footer_images/footer_sprite.png +0 -0
  106. data/lib/bookends/templates/footer_images/footer_sprite@2x.png +0 -0
  107. data/lib/bookends/templates/footer_images/salesforce.png +0 -0
  108. data/lib/bookends/templates/newsletter-init-turbolinks.js +6 -0
  109. data/lib/bookends/templates/newsletter-init.js +6 -0
  110. data/lib/{generators/bookends/install → bookends}/templates/newsletter.js +0 -4
  111. data/lib/bookends/version.rb +1 -1
  112. data/lib/bookends.rb +1 -1
  113. metadata +138 -11
  114. data/lib/generators/bookends/install/install_generator.rb +0 -21
@@ -0,0 +1,48 @@
1
+ //************************************************************************//
2
+ // Background-image property for adding multiple background images with
3
+ // gradients, or for stringing multiple gradients together.
4
+ //************************************************************************//
5
+
6
+ @mixin background-image($images...) {
7
+ background-image: _add-prefix($images, webkit);
8
+ background-image: _add-prefix($images);
9
+ }
10
+
11
+ @function _add-prefix($images, $vendor: false) {
12
+ $images-prefixed: ();
13
+ $gradient-positions: false;
14
+ @for $i from 1 through length($images) {
15
+ $type: type-of(nth($images, $i)); // Get type of variable - List or String
16
+
17
+ // If variable is a list - Gradient
18
+ @if $type == list {
19
+ $gradient-type: nth(nth($images, $i), 1); // linear or radial
20
+ $gradient-pos: null;
21
+ $gradient-args: null;
22
+
23
+ @if ($gradient-type == linear) or ($gradient-type == radial) {
24
+ $gradient-pos: nth(nth($images, $i), 2); // Get gradient position
25
+ $gradient-args: nth(nth($images, $i), 3); // Get actual gradient (red, blue)
26
+ }
27
+ @else {
28
+ $gradient-args: nth(nth($images, $i), 2); // Get actual gradient (red, blue)
29
+ }
30
+
31
+ $gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
32
+ $gradient: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
33
+ $images-prefixed: append($images-prefixed, $gradient, comma);
34
+ }
35
+ // If variable is a string - Image
36
+ @else if $type == string {
37
+ $images-prefixed: join($images-prefixed, nth($images, $i), comma);
38
+ }
39
+ }
40
+ @return $images-prefixed;
41
+ }
42
+
43
+ //Examples:
44
+ //@include background-image(linear-gradient(top, orange, red));
45
+ //@include background-image(radial-gradient(50% 50%, cover circle, orange, red));
46
+ //@include background-image(url("/images/a.png"), linear-gradient(orange, red));
47
+ //@include background-image(url("image.png"), linear-gradient(orange, red), url("image.png"));
48
+ //@include background-image(linear-gradient(hsla(0, 100%, 100%, 0.25) 0%, hsla(0, 100%, 100%, 0.08) 50%, transparent 50%), linear-gradient(orange, red));
@@ -0,0 +1,22 @@
1
+ //************************************************************************//
2
+ // Shorthand Border-radius mixins
3
+ //************************************************************************//
4
+ @mixin border-top-radius($radii) {
5
+ @include prefixer(border-top-left-radius, $radii, spec);
6
+ @include prefixer(border-top-right-radius, $radii, spec);
7
+ }
8
+
9
+ @mixin border-bottom-radius($radii) {
10
+ @include prefixer(border-bottom-left-radius, $radii, spec);
11
+ @include prefixer(border-bottom-right-radius, $radii, spec);
12
+ }
13
+
14
+ @mixin border-left-radius($radii) {
15
+ @include prefixer(border-top-left-radius, $radii, spec);
16
+ @include prefixer(border-bottom-left-radius, $radii, spec);
17
+ }
18
+
19
+ @mixin border-right-radius($radii) {
20
+ @include prefixer(border-top-right-radius, $radii, spec);
21
+ @include prefixer(border-bottom-right-radius, $radii, spec);
22
+ }
@@ -0,0 +1,4 @@
1
+ @mixin box-sizing ($box) {
2
+ // content-box | border-box | inherit
3
+ @include prefixer(box-sizing, $box, webkit moz spec);
4
+ }
@@ -0,0 +1,5 @@
1
+ @mixin hide-text {
2
+ color: transparent;
3
+ font: 0/0 a;
4
+ text-shadow: none;
5
+ }
@@ -0,0 +1,10 @@
1
+ // HiDPI mixin. Default value set to 1.3 to target Google Nexus 7 (http://bjango.com/articles/min-device-pixel-ratio/)
2
+ @mixin hidpi($ratio: 1.3) {
3
+ @media only screen and (-webkit-min-device-pixel-ratio: $ratio),
4
+ only screen and (min--moz-device-pixel-ratio: $ratio),
5
+ only screen and (-o-min-device-pixel-ratio: #{$ratio}/1),
6
+ only screen and (min-resolution: #{round($ratio*96)}dpi),
7
+ only screen and (min-resolution: #{$ratio}dppx) {
8
+ @content;
9
+ }
10
+ }
@@ -0,0 +1,41 @@
1
+ @mixin linear-gradient($pos, $G1, $G2: false,
2
+ $G3: false, $G4: false,
3
+ $G5: false, $G6: false,
4
+ $G7: false, $G8: false,
5
+ $G9: false, $G10: false,
6
+ $deprecated-pos1: left top,
7
+ $deprecated-pos2: left bottom,
8
+ $fallback: false) {
9
+ // Detect what type of value exists in $pos
10
+ $pos-type: type-of(nth($pos, 1));
11
+ $pos-spec: null;
12
+ $pos-degree: null;
13
+
14
+ // If $pos is missing from mixin, reassign vars and add default position
15
+ @if ($pos-type == color) or (nth($pos, 1) == "transparent") {
16
+ $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;
17
+ $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;
18
+ $pos: null;
19
+ }
20
+
21
+ @if $pos {
22
+ $positions: _linear-positions-parser($pos);
23
+ $pos-degree: nth($positions, 1);
24
+ $pos-spec: nth($positions, 2);
25
+ }
26
+
27
+ $full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
28
+
29
+ // Set $G1 as the default fallback color
30
+ $fallback-color: nth($G1, 1);
31
+
32
+ // If $fallback is a color use that color as the fallback color
33
+ @if (type-of($fallback) == color) or ($fallback == "transparent") {
34
+ $fallback-color: $fallback;
35
+ }
36
+
37
+ background-color: $fallback-color;
38
+ background-image: _deprecated-webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $full); // Safari <= 5.0
39
+ background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome
40
+ background-image: unquote("linear-gradient(#{$pos-spec}#{$full})");
41
+ }
@@ -0,0 +1,49 @@
1
+ //************************************************************************//
2
+ // Example: @include prefixer(border-radius, $radii, webkit ms spec);
3
+ //************************************************************************//
4
+ $prefix-for-webkit: true !default;
5
+ $prefix-for-mozilla: true !default;
6
+ $prefix-for-microsoft: true !default;
7
+ $prefix-for-opera: true !default;
8
+ $prefix-for-spec: true !default; // required for keyframe mixin
9
+
10
+ @mixin prefixer ($property, $value, $prefixes) {
11
+ @each $prefix in $prefixes {
12
+ @if $prefix == webkit {
13
+ @if $prefix-for-webkit {
14
+ -webkit-#{$property}: $value;
15
+ }
16
+ }
17
+ @else if $prefix == moz {
18
+ @if $prefix-for-mozilla {
19
+ -moz-#{$property}: $value;
20
+ }
21
+ }
22
+ @else if $prefix == ms {
23
+ @if $prefix-for-microsoft {
24
+ -ms-#{$property}: $value;
25
+ }
26
+ }
27
+ @else if $prefix == o {
28
+ @if $prefix-for-opera {
29
+ -o-#{$property}: $value;
30
+ }
31
+ }
32
+ @else if $prefix == spec {
33
+ @if $prefix-for-spec {
34
+ #{$property}: $value;
35
+ }
36
+ }
37
+ @else {
38
+ @warn "Unrecognized prefix: #{$prefix}";
39
+ }
40
+ }
41
+ }
42
+
43
+ @mixin disable-prefix-for-all() {
44
+ $prefix-for-webkit: false;
45
+ $prefix-for-mozilla: false;
46
+ $prefix-for-microsoft: false;
47
+ $prefix-for-opera: false;
48
+ $prefix-for-spec: false;
49
+ }
@@ -0,0 +1,129 @@
1
+ @mixin screen($threshold: max-width, $screen: 1080px) {
2
+ @media ($threshold: $screen) {
3
+ @content;
4
+ }
5
+ }
6
+
7
+ @mixin desktop {
8
+ @media (min-width: $tablet-threshold + 1) {
9
+ @content;
10
+ }
11
+ }
12
+
13
+ @mixin mobile {
14
+ @media (max-width: $mobile-threshold) {
15
+ @content;
16
+ }
17
+ }
18
+
19
+ @mixin mobile-landscape {
20
+ @media (max-width: $mobile-landscape-threshold) {
21
+ @content;
22
+ }
23
+ }
24
+
25
+ @mixin tablet {
26
+ @media (max-width: $tablet-threshold) {
27
+ @content;
28
+ }
29
+ }
30
+
31
+ @mixin tablet-landscape {
32
+ @media (max-width: $tablet-landscape-threshold) {
33
+ @content;
34
+ }
35
+ }
36
+
37
+ @mixin large-screen {
38
+ @media (min-width: $large-screen-threshold) {
39
+ @content;
40
+ }
41
+ }
42
+
43
+ @mixin screen-max-height($screen-height: 750px) {
44
+ @media (max-height: $screen-height) {
45
+ @content;
46
+ }
47
+ }
48
+
49
+ @mixin columns(
50
+ $desktop: $tartan-column-count,
51
+ $tablet: "",
52
+ $mobile: ""
53
+ ) {
54
+ @include tartan-span-columns($desktop);
55
+
56
+ @if ($desktop == 1) {
57
+ &:nth-child(12n + 12) { @include tartan-omega; }
58
+ }
59
+
60
+ @if ($desktop == 2) {
61
+ &:nth-child(6n + 6) { @include tartan-omega; }
62
+ }
63
+
64
+ @if ($desktop == 3) {
65
+ &:nth-child(4n + 4) { @include tartan-omega; }
66
+ }
67
+
68
+ @if ($desktop == 4) {
69
+ &:nth-child(3n + 3) { @include tartan-omega; }
70
+ }
71
+
72
+ @if ($desktop == 6) {
73
+ &:nth-child(even) { @include tartan-omega; }
74
+ }
75
+
76
+ @if ($tablet != "") {
77
+ @include tablet {
78
+ &:nth-child(n) { @include tartan-no-omega } // Specificity
79
+ @include tartan-span-columns($tablet);
80
+
81
+ @if ($tablet == 1) {
82
+ &:nth-child(12n + 12) { @include tartan-omega; }
83
+ }
84
+
85
+ @if ($tablet == 2) {
86
+ &:nth-child(6n + 6) { @include tartan-omega; }
87
+ }
88
+
89
+ @if ($tablet == 3) {
90
+ &:nth-child(4n + 4) { @include tartan-omega; }
91
+ }
92
+
93
+ @if ($tablet == 4) {
94
+ &:nth-child(3n + 3) { @include tartan-omega; }
95
+ }
96
+
97
+ @if ($tablet == 6) {
98
+ &:nth-child(2n + 2) { @include tartan-omega; }
99
+ }
100
+ }
101
+ }
102
+
103
+ @if ($mobile != "") {
104
+ @include mobile-landscape {
105
+ &:nth-child(n) { @include tartan-no-omega } // Specificity
106
+ @include tartan-span-columns($mobile);
107
+
108
+ @if ($mobile == 1) {
109
+ &:nth-child(12n + 12) { @include tartan-omega; }
110
+ }
111
+
112
+ @if ($mobile == 2) {
113
+ &:nth-child(6n + 6) { @include tartan-omega; }
114
+ }
115
+
116
+ @if ($mobile == 3) {
117
+ &:nth-child(4n + 4) { @include tartan-omega; }
118
+ }
119
+
120
+ @if ($mobile == 4) {
121
+ &:nth-child(3n + 3) { @include tartan-omega; }
122
+ }
123
+
124
+ @if ($mobile == 6) {
125
+ &:nth-child(even) { @include tartan-omega; }
126
+ }
127
+ }
128
+ }
129
+ }
@@ -0,0 +1,31 @@
1
+ @mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $asset-pipeline: false) {
2
+ @if $asset-pipeline {
3
+ background-image: image-url("#{$filename}.#{$extension}");
4
+ }
5
+ @else {
6
+ background-image: url("#{$filename}.#{$extension}");
7
+ }
8
+
9
+ @include hidpi {
10
+ @if $asset-pipeline {
11
+ @if $retina-filename {
12
+ background-image: image-url("#{$retina-filename}.#{$extension}");
13
+ }
14
+ @else {
15
+ background-image: image-url("#{$filename}@2x.#{$extension}");
16
+ }
17
+ }
18
+
19
+ @else {
20
+ @if $retina-filename {
21
+ background-image: url("#{$retina-filename}.#{$extension}");
22
+ }
23
+ @else {
24
+ background-image: url("#{$filename}@2x.#{$extension}");
25
+ }
26
+ }
27
+
28
+ background-size: $background-size;
29
+
30
+ }
31
+ }
@@ -0,0 +1,44 @@
1
+ @mixin size($size) {
2
+ @if length($size) == 1 {
3
+ @if $size == auto {
4
+ width: $size;
5
+ height: $size;
6
+ }
7
+
8
+ @else if unitless($size) {
9
+ width: $size + px;
10
+ height: $size + px;
11
+ }
12
+
13
+ @else if not(unitless($size)) {
14
+ width: $size;
15
+ height: $size;
16
+ }
17
+ }
18
+
19
+ // Width x Height
20
+ @if length($size) == 2 {
21
+ $width: nth($size, 1);
22
+ $height: nth($size, 2);
23
+
24
+ @if $width == auto {
25
+ width: $width;
26
+ }
27
+ @else if not(unitless($width)) {
28
+ width: $width;
29
+ }
30
+ @else if unitless($width) {
31
+ width: $width + px;
32
+ }
33
+
34
+ @if $height == auto {
35
+ height: $height;
36
+ }
37
+ @else if not(unitless($height)) {
38
+ height: $height;
39
+ }
40
+ @else if unitless($height) {
41
+ height: $height + px;
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,34 @@
1
+ // Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.
2
+ // Example: @include transition (all, 2.0s, ease-in-out);
3
+ // @include transition ((opacity, width), (1.0s, 2.0s), ease-in, (0, 2s));
4
+ // @include transition ($property:(opacity, width), $delay: (1.5s, 2.5s));
5
+
6
+ @mixin transition ($properties...) {
7
+ @if length($properties) >= 1 {
8
+ @include prefixer(transition, $properties, webkit moz spec);
9
+ }
10
+
11
+ @else {
12
+ $properties: all 0.15s ease-out 0;
13
+ @include prefixer(transition, $properties, webkit moz spec);
14
+ }
15
+ }
16
+
17
+ @mixin transition-property ($properties...) {
18
+ -webkit-transition-property: transition-property-names($properties, 'webkit');
19
+ -moz-transition-property: transition-property-names($properties, 'moz');
20
+ transition-property: transition-property-names($properties, false);
21
+ }
22
+
23
+ @mixin transition-duration ($times...) {
24
+ @include prefixer(transition-duration, $times, webkit moz spec);
25
+ }
26
+
27
+ @mixin transition-timing-function ($motions...) {
28
+ // ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()
29
+ @include prefixer(transition-timing-function, $motions, webkit moz spec);
30
+ }
31
+
32
+ @mixin transition-delay ($times...) {
33
+ @include prefixer(transition-delay, $times, webkit moz spec);
34
+ }
@@ -0,0 +1,45 @@
1
+ @mixin triangle ($size, $color, $direction) {
2
+ height: 0;
3
+ width: 0;
4
+
5
+ @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) {
6
+ border-color: transparent;
7
+ border-style: solid;
8
+ border-width: $size / 2;
9
+
10
+ @if $direction == up {
11
+ border-bottom-color: $color;
12
+
13
+ } @else if $direction == right {
14
+ border-left-color: $color;
15
+
16
+ } @else if $direction == down {
17
+ border-top-color: $color;
18
+
19
+ } @else if $direction == left {
20
+ border-right-color: $color;
21
+ }
22
+ }
23
+
24
+ @else if ($direction == up-right) or ($direction == up-left) {
25
+ border-top: $size solid $color;
26
+
27
+ @if $direction == up-right {
28
+ border-left: $size solid transparent;
29
+
30
+ } @else if $direction == up-left {
31
+ border-right: $size solid transparent;
32
+ }
33
+ }
34
+
35
+ @else if ($direction == down-right) or ($direction == down-left) {
36
+ border-bottom: $size solid $color;
37
+
38
+ @if $direction == down-right {
39
+ border-left: $size solid transparent;
40
+
41
+ } @else if $direction == down-left {
42
+ border-right: $size solid transparent;
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "Engineering",
3
+ "description": "Heroku engineering blog",
4
+ "website": "https://engineering.heroku.com/",
5
+ "repository": "https://github.com/heroku/engineering",
6
+ "success_url": "/",
7
+ "buildpacks": [
8
+ {
9
+ "url": "https://github.com/dmathieu/heroku-buildpack-jekyll.git"
10
+ },
11
+ {
12
+ "url": "https://github.com/hone/heroku-buildpack-static"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ cat | fold -s -w 72 | sed -e 's/“/"/' | sed -e 's/”/"/'
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+
3
+ if [ -z "$DEPLOY" ]; then
4
+ echo "Missing DEPLOY" 1>&2; exit 1
5
+ fi
6
+
7
+ set -exo pipefail
8
+
9
+ heroku create -r $DEPLOY heroku-engineering-$DEPLOY
10
+
11
+ heroku buildpacks:add https://github.com/dmathieu/heroku-buildpack-jekyll.git -r $DEPLOY
12
+ heroku buildpacks:add https://github.com/hone/heroku-buildpack-static.git -r $DEPLOY
13
+
14
+ git push $DEPLOY $(git rev-parse --abbrev-ref HEAD):master
15
+ heroku open -r $DEPLOY
@@ -0,0 +1,34 @@
1
+ ---
2
+ layout: null
3
+ ---
4
+ <?xml version="1.0" encoding="UTF-8"?>
5
+ <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
6
+ <channel>
7
+ <title>{{ site.title | xml_escape }}</title>
8
+ <description>{{ site.description | xml_escape }}</description>
9
+ <link>{{ site.url }}{{ site.baseurl }}/</link>
10
+ <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
11
+ <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
12
+ <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
13
+ <generator>Jekyll v{{ jekyll.version }}</generator>
14
+
15
+ {% for post in site.posts limit:10 %}
16
+ <item>
17
+ <title>{{ post.title | xml_escape }}</title>
18
+ <description>{{ post.content | xml_escape }}</description>
19
+ <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
20
+ <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
21
+ <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
22
+
23
+ {% for tag in post.tags %}
24
+ <category>{{ tag | xml_escape }}</category>
25
+ {% endfor %}
26
+
27
+ {% for cat in post.categories %}
28
+ <category>{{ cat | xml_escape }}</category>
29
+ {% endfor %}
30
+
31
+ </item>
32
+ {% endfor %}
33
+ </channel>
34
+ </rss>
@@ -0,0 +1,40 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ <div class="row">
6
+ <div class="col-xs-12">
7
+ <h1>Heroku Engineering Blog</h1>
8
+ </div>
9
+
10
+ {% for post in site.posts %}
11
+ <div class="col-xs-12">
12
+ <article>
13
+ <div class="row">
14
+ <div class="col-xs-12 col-md-6">
15
+ <header>
16
+ <h2><a href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a></h2>
17
+ <div class="byline">
18
+ <time>{{ post.date | date: "%B %-d, %Y" }}</time>
19
+
20
+ {% if post.author_name %}
21
+ by {{ post.author_name }}
22
+ {% endif %}
23
+ </div>
24
+ </header>
25
+ </div>
26
+ <div class="col-xs-12 col-md-6">
27
+ {{ post.excerpt }}
28
+ <a href="{{ post.url | prepend: site.baseurl }}">Read more →</a>
29
+ </div>
30
+ </div>
31
+ </article>
32
+ </div>
33
+ {% endfor %}
34
+ </div>
35
+
36
+ <div id="feeds" style="margin-top:30px">
37
+ <p>
38
+ Subscribe to the <a title="Full-text RSS feed" href="/feed.xml">full-text</a> feed.
39
+ </p>
40
+ </div>
@@ -0,0 +1,3 @@
1
+ {
2
+ "https_only": true
3
+ }
@@ -0,0 +1,9 @@
1
+ # Bookends Dummy App
2
+
3
+ ### Spin up
4
+ ```
5
+ $ bundle install
6
+ $ cd project_root/spec/dummy/
7
+ $ rails s
8
+ $ open http://localhost:3000
9
+ ```
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks