Browse files

ghost plus poseidon theme

  • Loading branch information...
1 parent 949e24f commit ae6d805cbd6e03f31ecff560bbf0ff8cf8545466 @vesparny vesparny committed Feb 18, 2014
Showing with 67,535 additions and 17 deletions.
  1. +19 −0 .gitignore
  2. +859 −0 Gruntfile.js
  3. +19 −17 LICENSE
  4. +141 −0 config.example.js
  5. +141 −0 config.js
  6. +3 −0 content/data/README.md
  7. +3 −0 content/images/README.md
  8. +3 −0 content/plugins/README.md
  9. +22 −0 content/themes/casper/LICENSE
  10. +14 −0 content/themes/casper/README.md
  11. +406 −0 content/themes/casper/assets/css/normalize.css
  12. +952 −0 content/themes/casper/assets/css/screen.css
  13. +41 −0 content/themes/casper/assets/fonts/icons.dev.svg
  14. BIN content/themes/casper/assets/fonts/icons.eot
  15. +41 −0 content/themes/casper/assets/fonts/icons.svg
  16. BIN content/themes/casper/assets/fonts/icons.ttf
  17. BIN content/themes/casper/assets/fonts/icons.woff
  18. +15 −0 content/themes/casper/assets/js/index.js
  19. +74 −0 content/themes/casper/assets/js/jquery.fitvids.js
  20. +46 −0 content/themes/casper/default.hbs
  21. +39 −0 content/themes/casper/index.hbs
  22. +32 −0 content/themes/casper/page.hbs
  23. +61 −0 content/themes/casper/post.hbs
  24. +7 −0 content/themes/poseidon/README.md
  25. +8 −0 content/themes/poseidon/changelog.txt
  26. +646 −0 content/themes/poseidon/css/style.css
  27. +56 −0 content/themes/poseidon/default.hbs
  28. BIN content/themes/poseidon/images/logo.png
  29. BIN content/themes/poseidon/images/logo@2x.png
  30. BIN content/themes/poseidon/images/logo_single.png
  31. +7 −0 content/themes/poseidon/index.hbs
  32. +28 −0 content/themes/poseidon/js/general.js
  33. +4 −0 content/themes/poseidon/partials/footer.hbs
  34. +7 −0 content/themes/poseidon/partials/header-home.hbs
  35. +8 −0 content/themes/poseidon/partials/header-single.hbs
  36. +27 −0 content/themes/poseidon/partials/loop-archive.hbs
  37. +36 −0 content/themes/poseidon/partials/loop-single.hbs
  38. +4 −0 content/themes/poseidon/partials/pagination.hbs
  39. +7 −0 content/themes/poseidon/post.hbs
  40. +21,650 −0 core/built/scripts/ghost.js
  41. +16 −0 core/built/scripts/ghost.min.js
  42. +421 −0 core/built/scripts/helpers.js
  43. +229 −0 core/built/scripts/models.js
  44. +572 −0 core/built/scripts/templates.js
  45. +17,438 −0 core/built/scripts/vendor.js
  46. +2,987 −0 core/built/scripts/views.js
  47. +1 −0 core/client/assets/css/screen.css
  48. +287 −0 core/client/assets/fonts/icons.dev.svg
  49. BIN core/client/assets/fonts/icons.eot
  50. +287 −0 core/client/assets/fonts/icons.svg
  51. BIN core/client/assets/fonts/icons.ttf
  52. BIN core/client/assets/fonts/icons.woff
  53. BIN core/client/assets/img/404-ghost.png
  54. BIN core/client/assets/img/404-ghost@2x.png
  55. BIN core/client/assets/img/large.png
  56. BIN core/client/assets/img/loadingcat.gif
  57. BIN core/client/assets/img/medium.png
  58. BIN core/client/assets/img/small.png
  59. BIN core/client/assets/img/touch-icon-ipad.png
  60. BIN core/client/assets/img/touch-icon-iphone.png
  61. +175 −0 core/client/assets/lib/jquery-utils.js
  62. +260 −0 core/client/assets/lib/uploader.js
  63. +39 −0 core/client/assets/vendor/chart.min.js
  64. +59 −0 core/client/assets/vendor/codemirror/addon/mode/overlay.js
  65. +5,799 −0 core/client/assets/vendor/codemirror/codemirror.js
  66. +96 −0 core/client/assets/vendor/codemirror/mode/gfm/gfm.js
  67. +74 −0 core/client/assets/vendor/codemirror/mode/gfm/index.html
  68. +112 −0 core/client/assets/vendor/codemirror/mode/gfm/test.js
  69. +349 −0 core/client/assets/vendor/codemirror/mode/markdown/index.html
  70. +551 −0 core/client/assets/vendor/codemirror/mode/markdown/markdown.js
  71. +656 −0 core/client/assets/vendor/codemirror/mode/markdown/test.js
  72. +377 −0 core/client/assets/vendor/countable.js
  73. +761 −0 core/client/assets/vendor/fastclick.js
  74. +11 −0 core/client/assets/vendor/icheck/jquery.icheck.min.js
  75. +7 −0 core/client/assets/vendor/jquery.hammer.min.js
  76. +275 −0 core/client/assets/vendor/nprogress.js
  77. +14 −0 core/client/assets/vendor/packery.pkgd.min.js
  78. +224 −0 core/client/assets/vendor/shortcuts.js
  79. +45 −0 core/client/assets/vendor/showdown/extensions/ghostdown.js
  80. +62 −0 core/client/assets/vendor/showdown/showdown.js
  81. +22 −0 core/client/assets/vendor/to-title-case.js
  82. +1,010 −0 core/client/assets/vendor/validator-client.js
  83. +53 −0 core/client/helpers/index.js
  84. +89 −0 core/client/init.js
  85. +160 −0 core/client/markdown-actions.js
  86. +60 −0 core/client/mobile-interactions.js
  87. +32 −0 core/client/models/base.js
  88. +70 −0 core/client/models/post.js
  89. +10 −0 core/client/models/settings.js
  90. +8 −0 core/client/models/tag.js
  91. +9 −0 core/client/models/themes.js
  92. +38 −0 core/client/models/uploadModal.js
  93. +13 −0 core/client/models/user.js
  94. +43 −0 core/client/models/widget.js
  95. +78 −0 core/client/router.js
  96. +57 −0 core/client/toggle.js
  97. +6 −0 core/client/tpl/forgotten.hbs
  98. +572 −0 core/client/tpl/hbs-tpl.js
  99. +18 −0 core/client/tpl/list-item.hbs
  100. +12 −0 core/client/tpl/login.hbs
  101. +14 −0 core/client/tpl/modal.hbs
  102. +1 −0 core/client/tpl/modals/blank.hbs
  103. +4 −0 core/client/tpl/modals/copyToHTML.hbs
  104. +114 −0 core/client/tpl/modals/markdown.hbs
  105. +4 −0 core/client/tpl/modals/uploadImage.hbs
  106. +4 −0 core/client/tpl/notification.hbs
  107. +58 −0 core/client/tpl/preview.hbs
  108. +9 −0 core/client/tpl/reset.hbs
  109. +76 −0 core/client/tpl/settings/general.hbs
  110. +9 −0 core/client/tpl/settings/sidebar.hbs
  111. +88 −0 core/client/tpl/settings/user-profile.hbs
  112. +12 −0 core/client/tpl/signup.hbs
  113. +400 −0 core/client/views/base.js
  114. +279 −0 core/client/views/blog.js
  115. +157 −0 core/client/views/debug.js
  116. +291 −0 core/client/views/editor-tag-widget.js
  117. +724 −0 core/client/views/editor.js
  118. +259 −0 core/client/views/login.js
  119. +354 −0 core/client/views/post-settings.js
  120. +437 −0 core/client/views/settings.js
  121. +17 −0 core/index.js
  122. +14 −0 core/server.js
  123. +14 −0 core/server/api.js
  124. +136 −0 core/server/api/db.js
  125. +84 −0 core/server/api/index.js
  126. +47 −0 core/server/api/notifications.js
  127. +129 −0 core/server/api/posts.js
  128. +191 −0 core/server/api/settings.js
  129. +15 −0 core/server/api/tags.js
  130. +115 −0 core/server/api/users.js
  131. +106 −0 core/server/bookshelf-session.js
  132. +38 −0 core/server/config/index.js
  133. +120 −0 core/server/config/loader.js
  134. +192 −0 core/server/config/paths.js
  135. +37 −0 core/server/config/theme.js
  136. +347 −0 core/server/controllers/admin.js
  137. +227 −0 core/server/controllers/frontend.js
  138. +79 −0 core/server/data/default-settings.json
  139. +44 −0 core/server/data/export/index.js
  140. +105 −0 core/server/data/fixtures/index.js
  141. +200 −0 core/server/data/import/000.js
  142. +8 −0 core/server/data/import/001.js
  143. +8 −0 core/server/data/import/002.js
  144. +17 −0 core/server/data/import/index.js
  145. +299 −0 core/server/data/migration/index.js
  146. +129 −0 core/server/data/schema.js
  147. +242 −0 core/server/errorHandling.js
  148. +83 −0 core/server/filters.js
  149. +684 −0 core/server/helpers/index.js
  150. +26 −0 core/server/helpers/template.js
  151. +7 −0 core/server/helpers/tpl/nav.hbs
  152. +9 −0 core/server/helpers/tpl/pagination.hbs
  153. +287 −0 core/server/index.js
  154. +115 −0 core/server/mail.js
  155. +14 −0 core/server/middleware.js
  156. +86 −0 core/server/middleware/ghost-busboy.js
Sorry, we could not display the entire diff because it was too big.
View
19 .gitignore
@@ -0,0 +1,19 @@
+# Node
+node_modules
+
+## OS X
+.DS_Store
+.AppleDouble
+.LSOverride
+Icon
+._*
+.Spotlight-V100
+.Trashes
+
+## Windows
+Thumbs.db
+ehthumbs.db
+Desktop.ini
+$RECYCLE.BIN/
+
+*.db
View
859 Gruntfile.js
@@ -0,0 +1,859 @@
+// # Gruntfile - Task automation for Ghost
+// Run various tasks when developing for and working with Ghost
+// Run `grunt --help` or visit https://github.com/TryGhost/Ghost/wiki/Grunt-Toolkit/ for usage instructions
+
+var path = require('path'),
+ when = require('when'),
+ semver = require('semver'),
+ fs = require('fs'),
+ _ = require('underscore'),
+ spawn = require('child_process').spawn,
+ buildDirectory = path.resolve(process.cwd(), '.build'),
+ distDirectory = path.resolve(process.cwd(), '.dist'),
+ config = require('./core/server/config'),
+
+
+ // ## Build File Patterns
+ // a list of files and paterns to process and exclude when running builds & releases
+ buildGlob = [
+ '**',
+ '!docs/**',
+ '!_site/**',
+ '!content/images/**',
+ 'content/images/README.md',
+ '!content/themes/**',
+ 'content/themes/casper/**',
+ '!content/plugins/**',
+ 'content/plugins/README.md',
+ '!node_modules/**',
+ '!core/test/**',
+ '!core/client/assets/sass/**',
+ '!core/server/data/export/exported*',
+ '!**/*.db*',
+ '!*.db*',
+ '!.sass*',
+ '!.af*',
+ '!.git*',
+ '!.groc*',
+ '!*.iml',
+ '!config.js',
+ '!CONTRIBUTING.md',
+ '!SECURITY.md',
+ '!.travis.yml',
+ '!Gemfile*',
+ '!*.html'
+ ],
+
+ // ## Grunt configuration
+
+ configureGrunt = function (grunt) {
+
+ // load all grunt tasks
+ require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
+
+ var cfg = {
+ // Common paths to be used by tasks
+ paths: {
+ adminAssets: './core/client/assets',
+ build: buildDirectory,
+ releaseBuild: path.join(buildDirectory, 'release'),
+ dist: distDirectory,
+ releaseDist: path.join(distDirectory, 'release')
+ },
+ buildType: 'Build',
+ pkg: grunt.file.readJSON('package.json'),
+
+ // ### Config for grunt-contrib-watch
+ // Watch files and livereload in the browser during development
+ watch: {
+ handlebars: {
+ files: ['core/client/tpl/**/*.hbs'],
+ tasks: ['handlebars']
+ },
+ sass: {
+ files: ['<%= paths.adminAssets %>/sass/**/*'],
+ tasks: ['sass:admin']
+ },
+ concat: {
+ files: [
+ 'core/client/*.js',
+ 'core/client/helpers/*.js',
+ 'core/client/models/*.js',
+ 'core/client/tpl/*.js',
+ 'core/client/views/*.js'
+ ],
+ tasks: ['concat']
+ },
+ livereload: {
+ files: [
+ // Theme CSS
+ 'content/themes/casper/css/*.css',
+ // Theme JS
+ 'content/themes/casper/js/*.js',
+ // Admin CSS
+ '<%= paths.adminAssets %>/css/*.css',
+ // Admin JS
+ 'core/built/scripts/*.js'
+ ],
+ options: {
+ livereload: true
+ }
+ },
+ express: {
+ // Restart any time client or server js files change
+ files: ['core/server.js', 'core/server/**/*.js'],
+ tasks: ['express:dev'],
+ options: {
+ //Without this option specified express won't be reloaded
+ nospawn: true
+ }
+ }
+ },
+
+ // ### Config for grunt-express-server
+ // Start our server in development
+ express: {
+ options: {
+ script: 'index.js',
+ output: 'Ghost is running'
+ },
+
+ dev: {
+ options: {
+ //output: 'Express server listening on address:.*$'
+ }
+ },
+ test: {
+ options: {
+ node_env: 'testing'
+ }
+ }
+ },
+
+ // ### Config for grunt-jslint
+ // JSLint all the things!
+ jslint: {
+ server: {
+ directives: {
+ // node environment
+ node: true,
+ // browser environment
+ browser: false,
+ // allow dangling underscores in var names
+ nomen: true,
+ // allow to do statements
+ todo: true,
+ // don't require use strict pragma
+ sloppy: true
+ },
+ files: {
+ src: [
+ '*.js',
+ 'core/*.js',
+ 'core/server/**/*.js'
+ ]
+ }
+ },
+ client: {
+ directives: {
+ // node environment
+ node: false,
+ // browser environment
+ browser: true,
+ // allow dangling underscores in var names
+ nomen: true,
+ // allow to do statements
+ todo: true
+ },
+ files: {
+ src: 'core/client/**/*.js'
+ },
+ exclude: [
+ 'core/client/assets/vendor/**/*.js',
+ 'core/client/tpl/**/*.js'
+ ]
+ },
+ shared: {
+ directives: {
+ // node environment
+ node: true,
+ // browser environment
+ browser: false,
+ // allow dangling underscores in var names
+ nomen: true,
+ // allow to do statements
+ todo: true,
+ // allow unused parameters
+ unparam: true,
+ // don't require use strict pragma
+ sloppy: true
+ },
+ files: {
+ src: [
+ 'core/shared/**/*.js'
+ ]
+ },
+ exclude: [
+ 'core/shared/vendor/**/*.js'
+ ]
+ }
+ },
+
+ // ### Config for grunt-mocha-cli
+ // Run mocha unit tests
+ mochacli: {
+ options: {
+ ui: 'bdd',
+ reporter: 'spec',
+ timeout: '15000'
+ },
+
+ unit: {
+ src: ['core/test/unit/**/*_spec.js']
+ },
+
+ model: {
+ src: ['core/test/integration/**/model*_spec.js']
+ },
+
+ client: {
+ src: ['core/test/unit/**/client*_spec.js']
+ },
+
+ server: {
+ src: ['core/test/unit/**/server*_spec.js']
+ },
+
+ shared: {
+ src: ['core/test/unit/**/shared*_spec.js']
+ },
+
+ perm: {
+ src: ['core/test/unit/**/permissions_spec.js']
+ },
+
+ migrate: {
+ src: [
+ 'core/test/unit/**/export_spec.js',
+ 'core/test/unit/**/import_spec.js'
+ ]
+ },
+
+ storage: {
+ src: ['core/test/unit/**/storage*_spec.js']
+ },
+
+ integration: {
+ src: ['core/test/integration/**/model*_spec.js']
+ },
+
+ api: {
+ src: ['core/test/functional/api/*_test.js']
+ },
+
+ routes: {
+ src: ['core/test/functional/routes/*_test.js']
+ }
+ },
+
+ // ### Config for grunt-contrib-sass
+ // Compile all the SASS!
+ sass: {
+ admin: {
+ files: {
+ '<%= paths.adminAssets %>/css/screen.css': '<%= paths.adminAssets %>/sass/screen.scss'
+ }
+ },
+ compress: {
+ options: {
+ style: 'compressed'
+ },
+ files: {
+ '<%= paths.adminAssets %>/css/screen.css': '<%= paths.adminAssets %>/sass/screen.scss'
+ }
+ }
+ },
+
+ // ### config for grunt-shell
+ // command line tools
+ shell: {
+ // install bourbon
+ bourbon: {
+ command: 'bourbon install --path <%= paths.adminAssets %>/sass/modules/'
+ },
+ // generate coverage report
+ coverage: {
+ command: function () {
+ // will work on windows only if mocha is globally installed
+ var cmd = !!process.platform.match(/^win/) ? 'mocha' : './node_modules/mocha/bin/mocha';
+ return cmd + ' --timeout 15000 --reporter html-cov > coverage.html ./core/test/blanket_coverage.js';
+ },
+ execOptions: {
+ env: 'NODE_ENV=' + process.env.NODE_ENV
+ }
+ }
+ },
+
+ // ### Config for grunt-contrib-handlebars
+ // Compile templates for admin client
+ handlebars: {
+ core: {
+ options: {
+ namespace: 'JST',
+ processName: function (filename) {
+ filename = filename.replace('core/client/tpl/', '');
+ return filename.replace('.hbs', '');
+ }
+ },
+ files: {
+ 'core/client/tpl/hbs-tpl.js': 'core/client/tpl/**/*.hbs'
+ }
+ }
+ },
+
+ // ### Config for grunt-groc
+ // Generate documentation from code
+ groc: {
+ docs: {
+ options: {
+ 'out': './docs/',
+ 'glob': [
+ 'README.md',
+ 'config.example.js',
+ 'index.js',
+ 'core/*.js',
+ 'core/server/**/*.js',
+ 'core/shared/**/*.js',
+ 'core/client/**/*.js'
+ ],
+ 'except': [
+ '!core/**/vendor/**/*.js',
+ '!core/client/tpl/**/*.js'
+ ]
+ }
+ }
+ },
+
+ // ### Config for grunt-contrib-clean
+ // Clean up files as part of other tasks
+ clean: {
+ release: {
+ src: ['<%= paths.releaseBuild %>/**']
+ },
+ test: {
+ src: ['content/data/ghost-test.db']
+ }
+ },
+
+ // ### Config for grunt-contrib-copy
+ // Prepare files for builds / releases
+ copy: {
+ release: {
+ files: [{
+ expand: true,
+ src: buildGlob,
+ dest: '<%= paths.releaseBuild %>/'
+ }]
+ }
+ },
+
+ // ### Config for grunt-contrib-compress
+ // Zip up builds / releases
+ compress: {
+ release: {
+ options: {
+ archive: '<%= paths.releaseDist %>/Ghost-<%= pkg.version %>.zip'
+ },
+ expand: true,
+ cwd: '<%= paths.releaseBuild %>/',
+ src: ['**']
+ }
+ },
+
+ // ### Config for grunt-contrib-concat
+ // concatenate multiple JS files into a single file ready for use
+ concat: {
+ dev: {
+ files: {
+ 'core/built/scripts/vendor.js': [
+ 'core/shared/vendor/jquery/jquery.js',
+ 'core/shared/vendor/jquery/jquery-ui-1.10.3.custom.min.js',
+ 'core/client/assets/lib/jquery-utils.js',
+ 'core/client/assets/lib/uploader.js',
+ 'core/shared/vendor/underscore.js',
+ 'core/shared/vendor/backbone/backbone.js',
+ 'core/shared/vendor/handlebars/handlebars-runtime.js',
+ 'core/shared/vendor/moment.js',
+
+ 'core/shared/vendor/jquery/jquery.ui.widget.js',
+ 'core/shared/vendor/jquery/jquery.iframe-transport.js',
+ 'core/shared/vendor/jquery/jquery.fileupload.js',
+
+ 'core/client/assets/vendor/codemirror/codemirror.js',
+ 'core/client/assets/vendor/codemirror/addon/mode/overlay.js',
+ 'core/client/assets/vendor/codemirror/mode/markdown/markdown.js',
+ 'core/client/assets/vendor/codemirror/mode/gfm/gfm.js',
+ 'core/client/assets/vendor/showdown/showdown.js',
+ 'core/client/assets/vendor/showdown/extensions/ghostdown.js',
+ 'core/shared/vendor/showdown/extensions/github.js',
+ 'core/client/assets/vendor/shortcuts.js',
+ 'core/client/assets/vendor/validator-client.js',
+ 'core/client/assets/vendor/countable.js',
+ 'core/client/assets/vendor/to-title-case.js',
+ 'core/client/assets/vendor/packery.pkgd.min.js',
+ 'core/client/assets/vendor/fastclick.js',
+ 'core/client/assets/vendor/nprogress.js'
+ ],
+
+ 'core/built/scripts/helpers.js': [
+ 'core/client/init.js',
+
+ 'core/client/mobile-interactions.js',
+ 'core/client/toggle.js',
+ 'core/client/markdown-actions.js',
+ 'core/client/helpers/index.js'
+ ],
+
+ 'core/built/scripts/templates.js': [
+ 'core/client/tpl/hbs-tpl.js'
+ ],
+
+ 'core/built/scripts/models.js': [
+ 'core/client/models/**/*.js'
+ ],
+
+ 'core/built/scripts/views.js': [
+ 'core/client/views/**/*.js',
+ 'core/client/router.js'
+ ]
+ }
+ },
+ prod: {
+ files: {
+ 'core/built/scripts/ghost.js': [
+ 'core/shared/vendor/jquery/jquery.js',
+ 'core/shared/vendor/jquery/jquery-ui-1.10.3.custom.min.js',
+ 'core/client/assets/lib/jquery-utils.js',
+ 'core/client/assets/lib/uploader.js',
+ 'core/shared/vendor/underscore.js',
+ 'core/shared/vendor/backbone/backbone.js',
+ 'core/shared/vendor/handlebars/handlebars-runtime.js',
+ 'core/shared/vendor/moment.js',
+
+ 'core/shared/vendor/jquery/jquery.ui.widget.js',
+ 'core/shared/vendor/jquery/jquery.iframe-transport.js',
+ 'core/shared/vendor/jquery/jquery.fileupload.js',
+
+ 'core/client/assets/vendor/codemirror/codemirror.js',
+ 'core/client/assets/vendor/codemirror/addon/mode/overlay.js',
+ 'core/client/assets/vendor/codemirror/mode/markdown/markdown.js',
+ 'core/client/assets/vendor/codemirror/mode/gfm/gfm.js',
+ 'core/client/assets/vendor/showdown/showdown.js',
+ 'core/client/assets/vendor/showdown/extensions/ghostdown.js',
+ 'core/shared/vendor/showdown/extensions/github.js',
+ 'core/client/assets/vendor/shortcuts.js',
+ 'core/client/assets/vendor/validator-client.js',
+ 'core/client/assets/vendor/countable.js',
+ 'core/client/assets/vendor/to-title-case.js',
+ 'core/client/assets/vendor/packery.pkgd.min.js',
+ 'core/client/assets/vendor/fastclick.js',
+ 'core/client/assets/vendor/nprogress.js',
+
+ 'core/client/init.js',
+
+ 'core/client/mobile-interactions.js',
+ 'core/client/toggle.js',
+ 'core/client/markdown-actions.js',
+ 'core/client/helpers/index.js',
+
+ 'core/client/tpl/hbs-tpl.js',
+
+ 'core/client/models/**/*.js',
+
+ 'core/client/views/**/*.js',
+
+ 'core/client/router.js'
+ ]
+ }
+ }
+ },
+
+ // ### Config for grunt-contrib-uglify
+ // minify javascript file for production
+ uglify: {
+ prod: {
+ files: {
+ 'core/built/scripts/ghost.min.js': 'core/built/scripts/ghost.js'
+ }
+ }
+ }
+ };
+
+ grunt.initConfig(cfg);
+
+
+ // ## Custom Tasks
+
+ grunt.registerTask('setTestEnv', 'Use "testing" Ghost config; unless we are running on travis (then show queries for debugging)', function () {
+ process.env.NODE_ENV = process.env.TRAVIS ? 'travis-' + process.env.DB : 'testing';
+ cfg.express.test.options.node_env = process.env.NODE_ENV;
+ });
+
+ grunt.registerTask('loadConfig', function () {
+ var done = this.async();
+ config.load().then(function () {
+ done();
+ });
+ });
+
+ grunt.registerTask('spawn-casperjs', function () {
+ var done = this.async(),
+ options = ['host', 'noPort', 'port', 'email', 'password'],
+ args = ['test']
+ .concat(grunt.option('target') || ['admin/', 'frontend/'])
+ .concat(['--includes=base.js', '--verbose', '--log-level=debug', '--port=2369']);
+
+ // Forward parameters from grunt to casperjs
+ _.each(options, function processOption(option) {
+ if (grunt.option(option)) {
+ args.push('--' + option + '=' + grunt.option(option));
+ }
+ });
+
+ grunt.util.spawn({
+ cmd: 'casperjs',
+ args: args,
+ opts: {
+ cwd: path.resolve('core/test/functional'),
+ stdio: 'inherit'
+ }
+ }, function (error, result, code) {
+ /*jslint unparam:true*/
+ if (error) {
+ grunt.fail.fatal(result.stdout);
+ }
+ grunt.log.writeln(result.stdout);
+ done();
+ });
+ });
+
+ /* Generate Changelog
+ * - Pulls changelog from git, excluding merges.
+ * - Uses first line of commit message. Includes committer name.
+ */
+ grunt.registerTask('changelog', 'Generate changelog from Git', function () {
+ // TODO: Break the contents of this task out into a separate module,
+ // put on npm. (@cgiffard)
+
+ var done = this.async();
+
+ function git(args, callback, depth) {
+ depth = depth || 0;
+
+ if (!depth) {
+ grunt.log.writeln('git ' + args.join(' '));
+ }
+
+ var buffer = [];
+ spawn('git', args, {
+ // We can reasonably assume the gruntfile will be in the root of the repo.
+ cwd : __dirname,
+
+ stdio : ['ignore', 'pipe', process.stderr]
+
+ }).on('exit', function (code) {
+
+ // Process exited correctly but we got no output.
+ // Spawn again, but make sure we don't spiral out of control.
+ // Hack to work around an apparent node bug.
+ //
+ // Frustratingly, it's impossible to distinguish this
+ // bug from a genuine empty log.
+
+ if (!buffer.length && code === 0 && depth < 20) {
+ return setImmediate(function () {
+ git(args, callback, depth ? depth + 1 : 1);
+ });
+ }
+
+ if (code === 0) {
+ return callback(buffer.join(''));
+ }
+
+ // We failed. Git returned a non-standard exit code.
+ grunt.log.error('Git returned a non-zero exit code.');
+ done(false);
+
+ // Push returned data into the buffer
+ }).stdout.on('data', buffer.push.bind(buffer));
+ }
+
+ // Crazy function for getting around inconsistencies in tagging
+ function sortTags(a, b) {
+ a = a.tag;
+ b = b.tag;
+
+ // NOTE: Accounting for different tagging method for
+ // 0.2.1 and up.
+
+ // If we didn't have this issue I'd just pass rcompare
+ // into sort directly. Could be something to think about
+ // in future.
+
+ if (semver.rcompare(a, '0.2.0') < 0 ||
+ semver.rcompare(b, '0.2.0') < 0) {
+
+ return semver.rcompare(a, b);
+ }
+
+ a = a.split('-');
+ b = b.split('-');
+
+ if (semver.rcompare(a[0], b[0]) !== 0) {
+ return semver.rcompare(a[0], b[0]);
+ }
+
+ // Using this janky looking integerising-method
+ // because it's faster and doesn't result in NaN, which
+ // breaks sorting
+ /*jslint bitwise: true */
+ return (+b[1] | 0) - (+a[1] | 0);
+ }
+
+ // Gets tags in master branch, sorts them with semver,
+ function getTags(callback) {
+ git(['show-ref', '--tags'], function (results) {
+ results = results
+ .split(/\n+/)
+ .filter(function (tag) {
+ return tag.length && tag.match(/\/\d+\.\d+/);
+ })
+ .map(function (tag) {
+ return {
+ 'tag': tag.split(/tags\//).pop().trim(),
+ 'ref': tag.split(/\s+/).shift().trim()
+ };
+ })
+ .sort(sortTags);
+
+ callback(results);
+ });
+ }
+
+ // Parses log to extract commit data.
+ function parseLog(data) {
+ var commits = [],
+ commitRegex =
+ new RegExp(
+ '\\n*[|\\*\\s]*commit\\s+([a-f0-9]+)' +
+ '\\n[|\\*\\s]*Author:\\s+([^<\\n]+)<([^>\\n]+)>' +
+ '\\n[|\\*\\s]*Date:\\s+([^\\n]+)' +
+ '\\n+[|\\*\\s]*[ ]{4}([^\\n]+)',
+ 'ig'
+ );
+
+ // Using String.prototype.replace as a kind of poor-man's substitute
+ // for a streaming parser.
+ data.replace(
+ commitRegex,
+ function (wholeCommit, hash, author, email, date, message) {
+ /*jslint unparam:true*/
+
+ // The author name and commit message may have trailing space.
+ author = author.trim();
+ message = message.trim();
+
+ // Reformat date to make it parse-able by JS
+ date =
+ date.replace(
+ /^(\w+)\s(\w+)\s(\d+)\s([\d\:]+)\s(\d+)\s([\+\-\d]+)$/,
+ '$1, $2 $3 $5 $4 $6'
+ );
+
+ commits.push({
+ 'hash': hash,
+ 'author': author,
+ 'email': email,
+ 'date': date,
+ 'parsedDate': new Date(Date.parse(date)),
+ 'message': message
+ });
+
+ return null;
+ }
+ );
+
+ return commits;
+ }
+
+ // Gets git log for specified range.
+ function getLog(to, from, callback) {
+ var range = from && to ? from + '..' + to : '',
+ args = [ 'log', 'master', '--no-color', '--no-merges', '--graph' ];
+
+ if (range) {
+ args.push(range);
+ }
+
+ git(args, function (data) {
+ callback(parseLog(data));
+ });
+ }
+
+ // Run the job
+ getTags(function (tags) {
+ var logPath = path.join(__dirname, 'CHANGELOG.md'),
+ log = fs.createWriteStream(logPath),
+ commitCache = {};
+
+ function processTag(tag, callback) {
+ var buffer = '',
+ peek = tag[1];
+
+ tag = tag[0];
+
+ getLog(tag.tag, peek.tag, function (commits) {
+
+ // Use the comparison with HEAD to remove commits which
+ // haven't been included in a build/release yet.
+
+ if (tag.tag === 'HEAD') {
+ commits.forEach(function (commit) {
+ commitCache[commit.hash] = true;
+ });
+
+ return callback('');
+ }
+
+ buffer += '## Release ' + tag.tag + '\n';
+
+ commits = commits
+ .filter(function (commit) {
+
+ // Get rid of jenkins' release tagging commits
+ // Remove commits we've already spat out
+ return (
+ commit.author !== 'TryGhost-Jenkins' &&
+ !commitCache[commit.hash]
+ );
+ })
+ .map(function (commit) {
+ buffer += '\n* ' + commit.message + ' (_' + commit.author + '_)';
+ commitCache[commit.hash] = true;
+ });
+
+ if (!commits.length) {
+ buffer += '\nNo changes were made in this build.\n';
+ }
+
+ callback(buffer + '\n');
+ });
+ }
+
+ // Get two weeks' worth of tags
+ tags.unshift({'tag': 'HEAD'});
+
+ tags =
+ tags
+ .slice(0, 14)
+ .map(function (tag, index) {
+ return [
+ tag,
+ tags[index + 1] || tags[index]
+ ];
+ });
+
+ log.write('# Ghost Changelog\n\n');
+ log.write('_Showing ' + tags.length + ' releases._\n');
+
+ when.reduce(tags,
+ function (prev, tag, idx) {
+ /*jslint unparam:true*/
+ return when.promise(function (resolve) {
+ processTag(tag, function (releaseData) {
+ resolve(prev + '\n' + releaseData);
+ });
+ });
+ }, '')
+ .then(function (reducedChangelog) {
+ log.write(reducedChangelog);
+ log.close();
+ done(true);
+ });
+ });
+ });
+
+ grunt.registerTask('release',
+ 'Release task - creates a final built zip\n' +
+ ' - Do our standard build steps (sass, handlebars, etc)\n' +
+ ' - Generate changelog for the past 14 releases\n' +
+ ' - Copy files to release-folder/#/#{version} directory\n' +
+ ' - Clean out unnecessary files (travis, .git*, .af*, .groc*)\n' +
+ ' - Zip files in release-folder to dist-folder/#{version} directory',
+ [
+ 'shell:bourbon',
+ 'sass:compress',
+ 'handlebars',
+ 'concat',
+ 'uglify',
+ 'clean:release',
+ 'copy:release',
+ 'compress:release'
+ ]);
+
+ grunt.registerTask('dev',
+ 'Dev Mode; watch files and restart server on changes',
+ [
+ 'sass:admin',
+ 'handlebars',
+ 'concat',
+ 'express:dev',
+ 'watch'
+ ]);
+
+ // ### Find out more about grunt task usage
+
+ grunt.registerTask('help',
+ 'Outputs help information if you type `grunt help` instead of `grunt --help`',
+ function () {
+ console.log('Type `grunt --help` to get the details of available grunt tasks, or alternatively visit https://github.com/TryGhost/Ghost/wiki/Grunt-Toolkit');
+ });
+
+
+ // ### Running the test suites
+
+ grunt.registerTask('test-unit', 'Run unit tests (mocha)', ['clean:test', 'setTestEnv', 'loadConfig', 'mochacli:unit']);
+
+ grunt.registerTask('test-integration', 'Run integration tests (mocha + db access)', ['clean:test', 'setTestEnv', 'loadConfig', 'mochacli:integration']);
+
+ grunt.registerTask('test-functional', 'Run functional interface tests (CasperJS)', ['clean:test', 'setTestEnv', 'loadConfig', 'express:test', 'spawn-casperjs', 'express:test:stop']);
+
+ grunt.registerTask('test-api', 'Run functional api tests (mocha)', ['clean:test', 'setTestEnv', 'loadConfig', 'express:test', 'mochacli:api', 'express:test:stop']);
+
+ grunt.registerTask('test-routes', 'Run functional route tests (mocha)', ['clean:test', 'setTestEnv', 'loadConfig', 'express:test', 'mochacli:routes', 'express:test:stop']);
+
+ grunt.registerTask('validate', 'Run tests and lint code', ['jslint', 'test-routes', 'test-unit', 'test-api', 'test-integration', 'test-functional']);
+
+
+ // ### Coverage report for Unit and Integration Tests
+
+ grunt.registerTask('test-coverage', 'Generate unit and integration (mocha) tests coverage report', ['clean:test', 'setTestEnv', 'loadConfig', 'shell:coverage']);
+
+
+ // ### Documentation
+
+ grunt.registerTask('docs', 'Generate Docs', ['groc']);
+
+
+ // ### Tools for building assets
+
+ grunt.registerTask('init', 'Prepare the project for development', ['shell:bourbon', 'default']);
+
+ // Before running in production mode
+ grunt.registerTask('prod', 'Build CSS, JS & templates for production', ['sass:compress', 'handlebars', 'concat', 'uglify']);
+
+ // When you just say 'grunt'
+ grunt.registerTask('default', 'Build CSS, JS & templates for development', ['update_submodules', 'sass:compress', 'handlebars', 'concat']);
+ };
+
+module.exports = configureGrunt;
View
36 LICENSE 100644 → 100755
@@ -1,20 +1,22 @@
-The MIT License (MIT)
+Copyright (c) 2014 Ghost Foundation - Released under The MIT License.
-Copyright (c) 2014 getPoseidon
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
View
141 config.example.js
@@ -0,0 +1,141 @@
+// # Ghost Configuration
+// Setup your Ghost install for various environments
+
+var path = require('path'),
+ config;
+
+config = {
+ // ### Development **(default)**
+ development: {
+ // The url to use when providing links to the site, E.g. in RSS and email.
+ url: 'http://my-ghost-blog.com',
+
+ // Example mail config
+ // Visit http://docs.ghost.org/mail for instructions
+ // ```
+ // mail: {
+ // transport: 'SMTP',
+ // options: {
+ // service: 'Mailgun',
+ // auth: {
+ // user: '', // mailgun username
+ // pass: '' // mailgun password
+ // }
+ // }
+ // },
+ // ```
+
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-dev.db')
+ },
+ debug: false
+ },
+ server: {
+ // Host to be passed to node's `net.Server#listen()`
+ host: '127.0.0.1',
+ // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
+ port: '2368'
+ }
+ },
+
+ // ### Production
+ // When running Ghost in the wild, use the production environment
+ // Configure your URL and mail settings here
+ production: {
+ url: 'http://my-ghost-blog.com',
+ mail: {},
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost.db')
+ },
+ debug: false
+ },
+ server: {
+ // Host to be passed to node's `net.Server#listen()`
+ host: '127.0.0.1',
+ // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
+ port: '2368'
+ }
+ },
+
+ // **Developers only need to edit below here**
+
+ // ### Testing
+ // Used when developing Ghost to run tests and check the health of Ghost
+ // Uses a different port number
+ testing: {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-test.db')
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-sqlite3': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-travis.db')
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-mysql': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'mysql',
+ connection: {
+ host : '127.0.0.1',
+ user : 'travis',
+ password : '',
+ database : 'ghost_travis',
+ charset : 'utf8'
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-pg': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'pg',
+ connection: {
+ host : '127.0.0.1',
+ user : 'postgres',
+ password : '',
+ database : 'ghost_travis',
+ charset : 'utf8'
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ }
+};
+
+// Export config
+module.exports = config;
View
141 config.js
@@ -0,0 +1,141 @@
+// # Ghost Configuration
+// Setup your Ghost install for various environments
+
+var path = require('path'),
+ config;
+
+config = {
+ // ### Development **(default)**
+ development: {
+ // The url to use when providing links to the site, E.g. in RSS and email.
+ url: 'http://my-ghost-blog.com',
+
+ // Example mail config
+ // Visit http://docs.ghost.org/mail for instructions
+ // ```
+ // mail: {
+ // transport: 'SMTP',
+ // options: {
+ // service: 'Mailgun',
+ // auth: {
+ // user: '', // mailgun username
+ // pass: '' // mailgun password
+ // }
+ // }
+ // },
+ // ```
+
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-dev.db')
+ },
+ debug: false
+ },
+ server: {
+ // Host to be passed to node's `net.Server#listen()`
+ host: '127.0.0.1',
+ // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
+ port: '2368'
+ }
+ },
+
+ // ### Production
+ // When running Ghost in the wild, use the production environment
+ // Configure your URL and mail settings here
+ production: {
+ url: 'http://my-ghost-blog.com',
+ mail: {},
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost.db')
+ },
+ debug: false
+ },
+ server: {
+ // Host to be passed to node's `net.Server#listen()`
+ host: '127.0.0.1',
+ // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
+ port: '2368'
+ }
+ },
+
+ // **Developers only need to edit below here**
+
+ // ### Testing
+ // Used when developing Ghost to run tests and check the health of Ghost
+ // Uses a different port number
+ testing: {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-test.db')
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-sqlite3': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'sqlite3',
+ connection: {
+ filename: path.join(__dirname, '/content/data/ghost-travis.db')
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-mysql': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'mysql',
+ connection: {
+ host : '127.0.0.1',
+ user : 'travis',
+ password : '',
+ database : 'ghost_travis',
+ charset : 'utf8'
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ },
+
+ // ### Travis
+ // Automated testing run through GitHub
+ 'travis-pg': {
+ url: 'http://127.0.0.1:2369',
+ database: {
+ client: 'pg',
+ connection: {
+ host : '127.0.0.1',
+ user : 'postgres',
+ password : '',
+ database : 'ghost_travis',
+ charset : 'utf8'
+ }
+ },
+ server: {
+ host: '127.0.0.1',
+ port: '2369'
+ }
+ }
+};
+
+// Export config
+module.exports = config;
View
3 content/data/README.md
@@ -0,0 +1,3 @@
+# Content / Data
+
+This is the home of your Ghost database, do not overwrite this folder or any of the files inside of it.
View
3 content/images/README.md
@@ -0,0 +1,3 @@
+# Content / Images
+
+If using the standard file storage, Ghost will upload images to this directory.
View
3 content/plugins/README.md
@@ -0,0 +1,3 @@
+# Content / Plugins
+
+Coming soon, Ghost plugins will appear here.
View
22 content/themes/casper/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2014 Ghost Foundation - Released under The MIT License.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
View
14 content/themes/casper/README.md
@@ -0,0 +1,14 @@
+# Casper
+
+The default theme for [Ghost](http://github.com/tryghost/ghost/).
+
+## Copyright & License
+
+Copyright (C) 2014 Ghost Foundation - Released under the MIT License.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
View
406 content/themes/casper/assets/css/normalize.css
@@ -0,0 +1,406 @@
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */
+
+/* ==========================================================================
+ HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined in IE 8/9.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * Correct `inline-block` display not defined in IE 8/9.
+ */
+
+audio,
+canvas,
+video {
+ display: inline-block;
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9.
+ * Hide the `template` element in IE, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* ==========================================================================
+ Base
+ ========================================================================== */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background: transparent;
+}
+
+/**
+ * Address `outline` inconsistency between Chrome and other browsers.
+ */
+
+a:focus {
+ outline: thin dotted;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* ==========================================================================
+ Typography
+ ========================================================================== */
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari 5, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9, Safari 5, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari 5 and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Correct font family set oddly in Safari 5 and Chrome.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, serif;
+ font-size: 1em;
+}
+
+/**
+ * Improve readability of pre-formatted text in all browsers.
+ */
+
+pre {
+ white-space: pre-wrap;
+}
+
+/**
+ * Set consistent quote types.
+ */
+
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* ==========================================================================
+ Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow displayed oddly in IE 9.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* ==========================================================================
+ Figures
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari 5.
+ */
+
+figure {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Forms
+ ========================================================================== */
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * 1. Correct font family not being inherited in all browsers.
+ * 2. Correct font size not being inherited in all browsers.
+ * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
+ */
+
+button,
+input,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+button,
+input {
+ line-height: normal;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
+ * Correct `select` style inheritance in Firefox 4+ and Opera.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari 5 and Chrome
+ * on OS X.
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * 1. Remove default vertical scrollbar in IE 8/9.
+ * 2. Improve readability and alignment in all browsers.
+ */
+
+textarea {
+ overflow: auto; /* 1 */
+ vertical-align: top; /* 2 */
+}
+
+/* ==========================================================================
+ Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
View
952 content/themes/casper/assets/css/screen.css
@@ -0,0 +1,952 @@
+/* ==========================================================================
+ Table of Contents
+ ========================================================================== */
+
+/*
+
+ 0. Includes
+ 1. Icons
+ 2. General
+ 3. Utilities
+ 4. General
+ 5. Single Post
+ 6. Third Party Elements
+ 7. Pagination
+ 8. Footer
+ 9. Media Queries (Tablet)
+ 10. Media Queries (Mobile)
+
+ */
+
+/* ==========================================================================
+ 0. Includes - Ground zero
+ ========================================================================== */
+
+@import url(normalize.css);
+
+
+/* ==========================================================================
+ 1. Icons - Sets up the icon font and respective classes
+ ========================================================================== */
+
+/* Import the font file with the icons in it */
+@font-face {
+ font-family: 'icons';
+ src:url('../fonts/icons.eot');
+ src:url('../fonts/icons.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/icons.woff') format('woff'),
+ url('../fonts/icons.ttf') format('truetype'),
+ url('../fonts/icons.svg#icons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* Apply these base styles to all icons */
+.icon-ghost:before,
+.icon-feed:before,
+.icon-twitter:before,
+.icon-google-plus:before,
+.icon-facebook:before {
+ font-family: 'icons';
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ text-decoration: none;
+}
+
+/* Each icon is created by inserting the corret character into the
+ content of the :before pseudo element. Like a boss. */
+.icon-ghost:before {
+ content: "\e000";
+}
+.icon-feed:before {
+ content: "\e001";
+}
+.icon-twitter:before {
+ content: "\e002";
+ font-size: 1.1em;
+}
+.icon-google-plus:before {
+ content: "\e003";
+}
+.icon-facebook:before {
+ content: "\e004";
+}
+
+
+/* ==========================================================================
+ 2. General - Setting up some base styles
+ ========================================================================== */
+
+html {
+ height: 100%;
+ max-height: 100%;
+ font-size: 62.5%;
+}
+
+body {
+ height: 100%;
+ max-height: 100%;
+ font-family: 'Noto Serif', serif;
+ font-size: 2.0rem;
+ line-height: 1.6em;
+ color: #3A4145;
+}
+
+::-moz-selection {
+ color: #222;
+ background: #D6EDFF;
+ text-shadow: none;
+}
+
+::selection {
+ color: #222;
+ background: #D6EDFF;
+ text-shadow: none;
+}
+
+h1, h2, h3,
+h4, h5, h6 {
+ text-rendering: optimizeLegibility;
+ line-height: 1;
+ margin-top: 0;
+ font-family: 'Open Sans', sans-serif;
+}
+
+h1 {
+ font-size: 5rem;
+ line-height: 1.2em;
+ letter-spacing: -2px;
+ text-indent: -3px;
+}
+
+h2 {
+ font-size: 4rem;
+ line-height: 1.2em;
+ letter-spacing: -1px;
+ text-indent: -2px;
+}
+
+h3 {
+ font-size: 3.5rem;
+}
+
+h4 {
+ font-size: 3rem;
+}
+
+h5 {
+ font-size: 2.5rem;
+}
+
+h6 {
+ font-size: 2rem;
+}
+
+a {
+ color: #4a4a4a;
+ transition: color ease 0.3s;
+}
+
+a:hover {
+ color: #57A3E8;
+}
+
+h1 a, h2 a, h3 a,
+h4 a, h5 a, h6 a {
+ color: #50585D;
+}
+
+
+p, ul, ol, dl {
+ margin: 1.6em 0;
+}
+
+ol ol, ul ul,
+ul ol, ol ul {
+ margin: 0.4em 0;
+}
+
+dl dt {
+ float: left;
+ width: 180px;
+ overflow: hidden;
+ clear: left;
+ text-align: right;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: bold;
+ margin-bottom: 1em
+}
+
+dl dd {
+ margin-left: 200px;
+ margin-bottom: 1em
+}
+
+hr {
+ display: block;
+ height: 1px;
+ border: 0;
+ border-top: 1px solid #efefef;
+ margin: 3.2em 0;
+ padding: 0;
+}
+
+blockquote {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 1.6em 0 1.6em -2.2em;
+ padding: 0 0 0 1.6em;
+ border-left: #4a4a4a 0.4em solid;
+}
+
+blockquote p {
+ margin: 0.8em 0;
+ font-style: italic;
+}
+
+blockquote small {
+ display: inline-block;
+ margin: 0.8em 0 0.8em 1.5em;
+ font-size:0.9em;
+ color: #ccc;
+}
+
+blockquote small:before { content: '\2014 \00A0'; }
+
+blockquote cite {
+ font-weight:bold;
+}
+
+blockquote cite a { font-weight: normal; }
+
+mark {
+ background-color: #ffc336;
+}
+
+code, tt {
+ padding: 1px 3px;
+ font-family: Inconsolata, monospace, sans-serif;
+ font-size: 0.85em;
+ white-space: pre-wrap;
+ border: 1px solid #E3EDF3;
+ background: #F7FAFB;
+ border-radius: 2px;
+}
+
+pre {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 1.6em 0;
+ border: 1px solid #E3EDF3;
+ width: 100%;
+ padding: 10px;
+ font-family: Inconsolata, monospace, sans-serif;
+ font-size: 0.9em;
+ white-space: pre;
+ overflow: auto;
+ background: #F7FAFB;
+ border-radius: 3px;
+}
+
+pre code, tt {
+ font-size: inherit;
+ white-space: -moz-pre-wrap;
+ white-space: pre-wrap;
+ background: transparent;
+ border: none;
+ padding: 0;
+}
+
+kbd {
+ display: inline-block;
+ margin-bottom: 0.4em;
+ padding: 1px 8px;
+ border: #ccc 1px solid;
+ color: #666;
+ text-shadow: #fff 0 1px 0;
+ font-size: 0.9em;
+ font-weight: bold;
+ background: #f4f4f4;
+ border-radius: 4px;
+ box-shadow:
+ 0 1px 0 rgba(0, 0, 0, 0.2),
+ 0 1px 0 0 #fff inset;
+}
+
+table {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 1.6em 0;
+ width:100%;
+ max-width: 100%;
+ background-color: transparent;
+}
+
+table th,
+table td {
+ padding: 8px;
+ line-height: 20px;
+ text-align: left;
+ vertical-align: top;
+ border-top: 1px solid #efefef;
+}
+
+table th { color: #000; }
+
+table caption + thead tr:first-child th,
+table caption + thead tr:first-child td,
+table colgroup + thead tr:first-child th,
+table colgroup + thead tr:first-child td,
+table thead:first-child tr:first-child th,
+table thead:first-child tr:first-child td {
+ border-top: 0;
+}
+
+table tbody + tbody { border-top: 2px solid #efefef; }
+
+table table table { background-color: #fff; }
+
+table tbody > tr:nth-child(odd) > td,
+table tbody > tr:nth-child(odd) > th {
+ background-color: #f6f6f6;
+}
+
+table.plain tbody > tr:nth-child(odd) > td,
+table.plain tbody > tr:nth-child(odd) > th {
+ background: transparent;
+}
+
+iframe, .fluid-width-video-wrapper {
+ display: block;
+ margin: 1.6em 0;
+}
+
+/* When a video is inside the fitvids wrapper, drop the
+margin on the iframe, cause it breaks stuff. */
+.fluid-width-video-wrapper iframe {
+ margin: 0;
+}
+
+
+/* ==========================================================================
+ 3. Utilities - These things get used a lot
+ ========================================================================== */
+
+/* Hides shit */
+.hidden {
+ text-indent: -9999px;
+ visibility: hidden;
+ display: none;
+}
+
+/* Creates a responsive wrapper that makes our content scale nicely */
+.inner {
+ position: relative;
+ width: 80%;
+ max-width: 700px;
+ margin: 0 auto;
+}
+
+/* Centres vertically yo. (IE8+) */
+.vertical {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+
+/* ==========================================================================
+ 4. General - The main styles for the the theme
+ ========================================================================== */
+
+/* Big cover image on the home page */
+.site-head {
+ position: relative;
+ display: table;
+ width: 100%;
+ height: 60%;
+ margin-bottom: 5rem;
+ text-align: center;
+ color: #fff;
+ background: #303538 no-repeat center center;
+ background-size: cover;
+}
+
+.blog-logo {
+ text-decoration: none;
+}
+
+/* Yo-logo. Yolo-go. Upload one in ghost/settings/ */
+.blog-logo img {
+ display: block;
+ max-height: 100px;
+ width: auto;
+ margin: 0 auto;
+ line-height: 0;
+}
+
+/* The details of your blog. Defined in ghost/settings/ */
+.blog-title {
+ margin: 10px 0 10px 0;
+ font-size: 5rem;
+ letter-spacing: -1px;
+ font-weight: bold;
+ font-family: 'Open Sans', sans-serif;
+ text-shadow: 0 1px 6px rgba(0,0,0,0.1);
+}
+
+.blog-description {
+ margin: 0;
+ font-size: 1.8rem;
+ line-height: 1.5em;
+ font-weight: 300;
+ font-family: 'Noto Serif', serif;
+ letter-spacing: 0;
+ text-shadow: 0 1px 3px rgba(0,0,0,0.15);
+}
+
+/* Every post, on every page, gets this style on its <article> tag */
+.post {
+ position: relative;
+ width:80%;
+ max-width: 700px;
+ margin: 4rem auto;
+ padding-bottom: 4rem;
+ border-bottom: #EBF2F6 1px solid;
+ word-break: break-word;
+ hyphens: auto;
+}