Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
  • 13 commits
  • 26 files changed
  • 0 commit comments
  • 1 contributor
Showing with 6,558 additions and 358 deletions.
  1. BIN  app/assets/images/octocat.png
  2. +11 −1 app/assets/javascripts/new_application.js
  3. +1 −0  app/assets/stylesheets/new_application.css
  4. +449 −84 app/assets/stylesheets/styles.less
  5. +6 −1 app/controllers/errors_controller.rb
  6. +2 −6 app/controllers/posts_controller.rb
  7. +3 −12 app/controllers/users_controller.rb
  8. +22 −146 app/views/layouts/landing.html.slim
  9. +3 −32 app/views/layouts/new_application.html.slim
  10. +2 −2 app/views/posts/_comments.html.slim
  11. +23 −28 app/views/posts/_form.html.slim
  12. +36 −4 app/views/posts/bookmarks.html.slim
  13. +1 −0  app/views/posts/flow.html.slim
  14. +25 −14 app/views/posts/index.html.slim
  15. +9 −4 app/views/posts/new.html.slim
  16. +11 −9 app/views/posts/show.html.slim
  17. +3 −1 app/views/shared/_follow.html.slim
  18. +7 −0 app/views/shared/_footer.html.slim
  19. +8 −3 app/views/shared/_profile.html.slim
  20. +19 −0 app/views/shared/_user.html.slim
  21. +29 −6 app/views/users/show.html.slim
  22. +4 −5 config/routes.rb
  23. +5,516 −0 vendor/assets/javascripts/codemirror.js
  24. +96 −0 vendor/assets/javascripts/codemirror_modes/gfm.js
  25. +246 −0 vendor/assets/stylesheets/codemirror.css
  26. +26 −0 vendor/assets/stylesheets/twilight.css
View
BIN  app/assets/images/octocat.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
12 app/assets/javascripts/new_application.js
@@ -2,4 +2,14 @@
//= require jquery_ujs
//= require underscore
//= require layout
-//= require cache
+//= require cache
+//= require codemirror
+
+$(document).ready(function(){
+ var myCodeMirror = CodeMirror.fromTextArea($('textarea#content')[0], {
+ tabSize: 2,
+ mode: 'gfm',
+ lineNumbers: false,
+ theme: 'default'
+ })
+})
View
1  app/assets/stylesheets/new_application.css
@@ -14,5 +14,6 @@
*= require highlighter
*= require markdown
*= require styles
+ *= require codemirror
*/
View
533 app/assets/stylesheets/styles.less
@@ -1,8 +1,11 @@
@link: #0069D6;
+@auth: #00a000;
@darkgray: #4b4b4b;
@text: #7a7a7a;
@lightgray: #eee;
+@gray: #999;
@red: #CC9090;
+@title-font: proxima-nova-condensed, sans-serif;
.rounded-corners (@radius: 3px) {
-webkit-border-radius: @radius;
@@ -37,6 +40,12 @@
-o-transition: @duration;
}
+.border-box {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
.inputable {
padding: 4px;
outline: none;
@@ -48,6 +57,15 @@
.rounded-corners(3px);
}
+.highlighted {
+ .easy-highlighted;
+ border: 1px solid #ddd;
+ .rounded-corners(2px);
+}
+.easy-highlighted {
+ background: url('grid.png');
+ background-size: 3px 3px;
+}
.button {
position: relative;
@@ -91,6 +109,9 @@
padding: 0;
border: 0;
}
+.button-primary {
+ font-weight: bold;
+}
.subtitle {
color: #666;
@@ -116,6 +137,7 @@ body {
width: 620px;
float: right;
overflow: hidden;
+ padding: 20px 0;
}
.row {
@@ -156,50 +178,44 @@ a.secondary {
}
.main-header {
- background: #eee;
- border-bottom: 2px solid @red;
- .gradient(#eee * 1.03, #eee);
+ border-top: 2px solid @red;
}
.main-logo {
- font-size: 32px;
- line-height: 49px;
- padding-top: 1px 10px 0;
- font-weight: 600;
- width: 860px;
- margin: 0 auto;
+ font-size: 30px;
+ line-height: 30px;
+ font-weight: 400;
+ font-family: @title-font;
a {
- color: #5e5e5e;
- text-shadow: 1px 1px rgba(255, 255, 255, 0.8);
+ color: #bbb;
+
+ &:hover {
+ color: @gray;
+ }
}
+ position: absolute;
+ left: -55px;
+ top: 56px;
+ -webkit-transform:rotate(-90deg);
+ z-index: 100;
+ margin: 0;
+ padding: 0;
+/* text-transform: lowercase;*/
}
-.main-auth {
+.main-sign-in {
position: absolute;
- right: 0;
- top: -32px;
-
- ul {
- margin: 0;
- padding: 0;
- list-style: none;
- font-size: 16px;
- line-height: 16px;
- font-weight: 600;
- }
-
- li {
- display: inline-block;
- margin-left: 5px;
- }
+ right: 10px;
+ top: 19px;
+ font-family: @title-font;
+ font-weight: 400;
+ font-size: 18px;
+ line-height: 18px;
+ z-index: 100;
+ text-transform: uppercase;
a {
- color: #4b4b4b;
- }
-
- a:hover {
- color: @text;
- text-decoration: none;
+ color: @auth;
}
}
@@ -229,6 +245,75 @@ a.secondary {
.profile-title {
font-size: 22px;
margin: 0 0 0 70px;
+
+ a {
+ color: @darkgray;
+
+ &:hover {
+ color: @text;
+ }
+ }
+}
+
+.profile-follow {
+ float: left;
+ padding: 5px 10px;
+
+ i {
+ margin-right: 6px;
+ }
+}
+
+.profile-data {
+ font-size: 16px;
+ color: @darkgray;
+ margin: 15px 0;
+
+ ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ li {
+ margin-bottom: 2px;
+
+ &:before {
+ content: "·";
+ margin: 0 8px 0 4px;
+ font-weight: bold;
+ font-size: 22px;
+ line-height: 16px;
+ }
+ }
+
+ a {
+ color: @darkgray;
+
+ &:hover {
+ color: @text;
+ }
+ }
+}
+
+.profile-settings-caret {
+ display: none !important;
+ margin-left: 2px;
+ font-size: 13px;
+}
+
+.profile-settings {
+ font-size: 16px;
+ vertical-align: top;
+ margin-left: 5px;
+ color: #ccc;
+
+ &:hover {
+ color: @gray;
+ .profile-settings-caret {
+ display: inline-block !important;
+ }
+ }
}
.profile-tags {
@@ -241,9 +326,17 @@ a.secondary {
line-height: 0;
font-size: 0;
+ border: 1px solid #ddd;
+ padding: 2px;
+ display: inline-block;
+ .rounded-corners(2px);
+ line-height: 0;
+ background: url('grid.png');
+ background-size: 3px 3px;
+
img {
- width: 60px;
- height: 60px;
+ width: 54px;
+ height: 54px;
border-radius: 4px;
}
}
@@ -275,6 +368,37 @@ a.secondary {
display: block;
}
+.profile-stats-mini {
+ float: left;
+ width: 150px;
+ margin-left: 10px;
+ padding: 6px 0;
+ position: relative;
+ left: -3px;
+
+ ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ li {
+ display: table-cell;
+ width: 30%;
+ font-size: 14px;
+ line-height: 16px;
+ white-space: nowrap;
+ padding: 0 10px 0 0;
+ font-family: @title-font;
+ color: @text;
+ }
+
+ i {
+ margin-right: 2px;
+ font-size: 16px;
+ }
+}
+
.profile-stats-value {
color: @text;
display: block;
@@ -298,7 +422,7 @@ a.secondary {
&:hover {
.gradient(@color * 1.4, @color / 1.4);
}
- &:active {
+ &:active, &.active {
.gradient(@color / 1.4, @color * 1.4);
}
}
@@ -332,6 +456,9 @@ a.secondary {
.follow-title {
font-size: 22px;
margin: 0 0 10px;
+ font-weight: 600;
+ font-family: @title-font;
+ color: @darkgray;
}
.follow-list {
@@ -345,15 +472,16 @@ a.secondary {
}
}
-
-.posts {
-
-}
-
-.posts-title {
- font-size: 28px;
- line-height: 64px;
- margin: 0;
+.posts-title, .content-title {
+ font-size: 18px;
+ line-height: 18px;
+ margin: 6px 0 10px;
+ position: relative;
+ top: -1px;
+ font-weight: 600;
+ font-family: @title-font;
+ text-transform: uppercase;
+ color: @darkgray;
}
@@ -377,16 +505,32 @@ a.secondary {
color: @text;
}
+.post-back {
+ font-size: 12px;
+ margin-bottom: 10px;
+
+ a {
+ display: block;
+ font-weight: 600;
+ padding: 8px 11px;
+ .easy-highlighted;
+ i {
+ font-size: 14px;
+ position: relative;
+ top: 1px;
+ }
+ }
+}
+
.post-links {
- padding: 8px 10px;
+ padding: 6px 10px;
margin-top: 10px;
font-size: 12px;
- background: url('grid.png');
- background-size: 3px 3px;
+ .highlighted;
a {
color: @text;
- margin-right: 10px;
+ margin-right: 18px;
font-weight: 600;
padding-left: 15px;
position: relative;
@@ -409,7 +553,7 @@ a.secondary {
.post-preview {
.post-links {
- margin-left: 60px;
+ margin-left: 50px;
}
}
@@ -431,28 +575,32 @@ a.secondary {
float: left;
a {
- border: 1px solid #ccc;
+ border: 1px solid #ddd;
padding: 2px;
display: inline-block;
+ .rounded-corners(2px);
line-height: 0;
+ background: url('grid.png');
+ background-size: 3px 3px;
}
img {
- width: 42px;
- height: 42px;
+ width: 34px;
+ height: 34px;
+ .rounded-corners(2px);
}
}
.post-preview {
> header {
- width: 560px;
+ width: 570px;
float: right;
}
}
.post-content-preview {
float: right;
- width: 560px;
+ width: 570px;
img {
max-height: 100px;
@@ -472,7 +620,7 @@ a.secondary {
top: 0;
font-size: 28px;
line-height: 34px;
- padding: 15px 0 0;
+ padding: 0;
}
}
@@ -489,41 +637,24 @@ a.secondary {
.main-footer {
margin-top: 20px;
- border-top: 2px solid @red;
- .gradient(#eee * 1.03, #eee);
-}
-
-.main-footer-menu {
- padding: 20px 0;
-
- ul {
- margin: 0;
- width: 240px;
- padding: 0;
- list-style: none;
- float: left;
- }
-}
-
-.main-footer-title {
- font-size: 12px;
- text-transform: uppercase;
- font-weight: bold;
- color: @text;
- padding-bottom: 5px;
+ border-bottom: 2px solid @red;
}
-
.main-footer-copyright {
- float: right;
- margin: 19px 0 0;
- text-align: right;
+ margin-top: 20px;
color: @text;
+ font-size: 13px;
a {
font-weight: bold;
}
}
+.main-footer-hr {
+ border: none;
+ border-bottom: 1px solid #ddd;
+ margin-top: 30px;
+}
+
.posts-similar {
width: 620px;
float: right;
@@ -646,7 +777,7 @@ a.secondary {
text-align: right;
padding: 5px 0;
- input {
+ a {
margin-left: 5px;
}
}
@@ -689,3 +820,237 @@ div#flash {
border-bottom: 2px solid #00ce00 * 1.5;
}
}
+
+.new-post {
+ input[type="text"], textarea {
+ font-size: 14px;
+ .border-box;
+ width: 100%;
+ border: 1px solid @gray;
+ .rounded-corners(2px);
+ padding: 5px;
+ color: @darkgray;
+
+ &:focus {
+ outline: none;
+ border-color: @text;
+ }
+ }
+
+ fieldset {
+ margin: 0 0 15px;
+ border: 0;
+ padding: 0;
+ }
+
+ .form-actions {
+ float: right;
+ text-align: right;
+ padding: 5px 0;
+
+ a {
+ margin-left: 5px;
+ }
+ }
+}
+
+.new-post-hint {
+ padding: 5px 0 0;
+ font-style: italic;
+ color: @text;
+}
+
+.new-post-notice {
+ float: left;
+ padding: 5px 0;
+ line-height: 24px;
+}
+
+.bookmarks-search {
+ input {
+ font-size: 14px;
+ .border-box;
+ width: 100%;
+ border: 1px solid @gray;
+ .rounded-corners(2px);
+ padding: 5px;
+ color: @darkgray;
+ outline: none;
+ }
+}
+
+.bookmarks-tags {
+ margin: 10px 0 20px;
+ ul {
+ padding: 0;
+ margin: 0;
+ }
+ li {
+ list-style: none;
+ display: inline-block;
+ margin: 0 10px 5px 0;
+
+ a {
+ border-bottom: 1px dashed;
+
+ &.disabled {
+ color: @text;
+ }
+ }
+ }
+}
+
+.bookmarks-tags-show-all {
+ a {
+ text-transform: lowercase;
+ color: @text;
+ font-weight: bold;
+ border-bottom: 1px dashed;
+ }
+}
+
+.bookmarks-posts {
+ ul {
+ padding: 0;
+ margin: 0;
+ }
+
+ li {
+ list-style: none;
+ font-size: 16px;
+ margin-bottom: 5px;
+ }
+
+ a {
+ display: block;
+ padding: 5px;
+
+ i { color: #bbb; }
+
+ &:hover {
+ .easy-highlighted;
+ i { color: @darkgray; }
+ }
+ }
+}
+
+.about {
+ .highlighted;
+ text-align: center;
+ padding: 16px 0;
+ overflow: hidden;
+ position: relative;
+}
+
+.about-title {
+ @size: 32px;
+ font-family: @title-font;
+ position: relative;
+ top: -3px;
+ margin: 0;
+ font-size: @size;
+ line-height: @size;
+ text-shadow: 1px 1px 0 white;
+}
+
+.about-description {
+ margin: 0;
+ font-style: italic;
+ margin-bottom: 10px;
+ text-shadow: 1px 1px 0 white;
+}
+
+.about-title, .about-description, .about-join {
+ z-index: 100;
+ position: relative;
+}
+
+.about-join {
+ font-weight: bold;
+ font-size: 16px;
+
+ a:hover {
+ color: green;
+ border: 1px solid #d4d4d4 * 0.9;
+ text-shadow: 1px 1px 0 #fff;
+ .gradient(#f4f4f4, #ececec);
+ .transition(1s);
+ }
+
+ a:active {
+ color: darkgreen;
+ }
+}
+
+.about:hover {
+ .about-ears, .about-ears-mirror {
+ bottom: -58px;
+ left: -77px;
+ .transition(1s);
+ }
+ .about-ears-mirror {
+ left: 77px;
+ }
+}
+
+.about-ears, .about-ears-mirror {
+ font-size: 120px;
+ position: absolute;
+ z-index: 10;
+ bottom: -118px;
+ left: -137px;
+ width: 218px;
+ text-align: center;
+ color: #eee;
+ background: url('octocat.png') no-repeat center center;
+ background-size: 160px 133px;
+ height: 166px;
+ -webkit-transform:rotate(45deg);
+}
+
+.about-ears-mirror {
+ bottom: -118px;
+ left: 137px;
+ -webkit-transform:rotate(-45deg);
+}
+
+.landing {
+ width: 620px;
+ position: relative;
+ margin: 0 auto 40px;
+}
+
+.landing-sign-up {
+ text-align: center;
+ font-family: @title-font;
+ font-weight: 400;
+ font-size: 32px;
+ color: #888;
+
+ a {
+ color: #00a000;
+ }
+}
+
+.landing-slogan {
+ font-size: 62px;
+ font-family: @title-font;
+ color: @darkgray;
+ font-weight: 300;
+ text-align: center;
+}
+
+.landing-background {
+ .post {
+ width: 620px;
+ z-index: 1;
+ background: white;
+ border: 3px solid @lightgray;
+ padding: 10px;
+ margin: 0 auto 20px;
+ }
+
+ header {
+ width: 620px;
+ }
+}
View
7 app/controllers/errors_controller.rb
@@ -2,6 +2,11 @@ class ErrorsController < ApplicationController
layout 'error'
def not_found
- render :not_found, formats: ['html']
+ if @user = User.find_by_username(params[:username])
+ @posts = @user.posts.with_privacy(@user, current_user).page(params[:page])
+ render 'users/show', layout: 'new_application'
+ else
+ render :not_found, formats: ['html']
+ end
end
end
View
8 app/controllers/posts_controller.rb
@@ -23,17 +23,13 @@ def flow
end
def bookmarks
- @posts = current_user.bookmarked_posts.page(params[:page])
+ @posts = current_user.bookmarked_posts
+ @tags = Tag.first(20) # @posts.tags_by_count
end
def show
@post = Post.find_by_param params[:id]
redirect_to(@post, status: 301) if params[:id] != @post.to_param
- if can? :create, :comments
- @comment = @post.comments.build do |c|
- c.user = current_user
- end
- end
@post.update_column(:page_views, @post.page_views + 1)
end
View
15 app/controllers/users_controller.rb
@@ -11,18 +11,9 @@ def create
end
def show
- if @user = User.includes(:profile).find_by_username(params[:id])
- @posts = @user.posts.with_privacy(@user, current_user).page(params[:page])
- respond_to do |format|
- format.html
- format.rss { render 'posts/index', :layout => false }
- end
- else
- respond_to do |format|
- format.html { render 'search/nothing' }
- format.rss { @posts = []; render 'posts/index', :layout => false }
- end
- end
+ @user = User.includes(:profile).find_by_username(params[:username])
+ @posts = @user.posts.with_privacy(@user, current_user).page(params[:page])
+ render layout: 'new_application'
end
protected
View
168 app/views/layouts/landing.html.slim
@@ -3,155 +3,31 @@ html
head
meta charset='UTF-8'
meta name='description' content='Social learning'
- = javascript_include_tag 'application'
+ = stylesheet_link_tag 'new_application'
+ = javascript_include_tag 'new_application'
= javascript_include_tag '//use.typekit.net/zky6kmq.js'
- = javascript_include_tag 'https://www.google.com/jsapi'
= favicon_link_tag '/assets/favicon.ico'
link rel="alternate" type="application/rss+xml" title="Gistflow :: All RSS feed" href="/all.rss"
javascript:
- try{Typekit.load();}catch(e){}
- = stylesheet_link_tag 'landing'
+ try{Typekit.load();}catch(e){}
= csrf_meta_tags
- title = "Gistflow :: Welcome"
+ title = "Gistflow"
= render :partial => 'shared/google_analytics'
- body
- = raw javascript_enabled?
- div class="wrap group"
- section class="landing"
- header
- h1 Join developers community blog, share and learn new skills
- nav class="login"
- ul
- li= link_to 'Login', auth_path
- li or
- li= link_to 'Skip', all_path
-
- div class="group"
- section class="gistflow"
- header
- h1 = Gistflow
- p social learning
- div class="fork-me"
- = link_to "https://github.com/gistflow/gistflow" do
- = image_tag "https://s3.amazonaws.com/github/ribbons/forkme_left_red_aa0000.png", alt: "Fork me on GitHub"
- div class="statistics group"
- div class="posts"
- h2 Posts
- p = @posts_count
- div class="tags"
- h2 Tags
- p = @tags_count
- div class="users"
- h2 Users
- p = @users_count
- div class="slider"
- = image_tag('landing/posts.png', 'data-name' => 'posts')
- nav
- ul
- li = link_to '', '#', 'data-rel' => asset_path('landing/posts.png'), :class => 'active'
- li = link_to '', '#', 'data-rel' => asset_path('landing/comments.png')
- li = link_to '', '#', 'data-rel' => asset_path('landing/profile.png')
- li = link_to '', '#', 'data-rel' => asset_path('landing/subscriptions.png')
- li = link_to '', '#', 'data-rel' => asset_path('landing/followers.png')
- div class="sign-up"
- = link_to 'Sign up', auth_path
- div class="description"
- p
- | When you learn something new share it with
- = link_to 'gistflow', auth_path
- div class="more" id="more"
- div class="message"
- h2 We made a place where developers can share their skills by writing code-related posts
- p
- | User
- strong following
- | ,
- strong subscriptions
- | for
- strong tags
- | , post
- strong comments,
- | personal
- strong bookmarks
- | ,
- strong ratings
- | , import code to posts from gist.github.com,
- strong markdown
- | and
- strong code highlighting
- | – by now all the necessary social features are implemented.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/github.png')
- h3 Github account
- p
- | Start your developer blog in two clicks using Github account. By our opinion Github – the best place to share code. You can find many
- em open source
- | projects there including Rails, jQuery and a lot more. So you definitely need to have Github to be a social coder and to be able to sign up for Gistflow.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/following.png')
- h3 User following
-
- p
- | We have following posts wall for you to be aware of all new posts from users you follow. Following developers is
- em a good way to learn
- | something new.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/tags.png')
- h3 Tags
- p
- | As simple as in Twitter. Use inline
- em hash #tags
- | to tag your posts. Subscribe for tags – your flow is basically posts tagged with tags you subscribed for. Search tags easily prepending "#" in search field.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/discuss.png')
- h3 Discussions
- p
- | Post questions and write comments,
- em @mention users
- | easily and subscribe for comments to featured posts – you will be notified by email and receive internal notification to not miss anything.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/gists.png')
- h3 Import code to posts from gist.github.com
- p
- | As you can see Gistflow is inspired
- em by gist.github.com
- | , so if you have any gists in Github we will
- em import them
- | carefully for you to be able to write posts based on gists.
-
- div class="group message"
- div class="image" = image_tag asset_path('landing/more/markdown.png')
- h3 Markdown
- p
- | Write beautiful posts with
- em Markdown
- | syntax, include
- em code snippets
- | directly in post body and it will be highlighted. Never heard about
- = link_to 'Markdown', 'http://daringfireball.net/projects/markdown/', target: :blank
- | ?
-
- = render :partial => 'layouts/time_counters'
- div class="message"
- h3 Present
- div id="chart"
- h3 Future
- p We are just in the beginning of our way, but as you can see we are working continuously to bring all the conceived features to production as soon as possible.
-
- div class="message"
- h2
- | You can start posting right away!
- = link_to 'Sign up', auth_path
- p class="center"
- | Feel free to talk to us
- = mail_to 'info@gistflow.com', 'info@gistflow.com', :encode => :hex
- = " or directly post here with "
- = link_to '#gistflow', tag_path('gistflow'), target: :blank
- = " tag."
- = render partial: 'shared/yandex_analytics'
-= render_git_version
+ body class="highlighted"
+ section class="landing"
+ header
+ h1 class="landing-slogan" Gistflow. Developer blogs
+ div class="landing-sign-up"
+ = link_to 'Sign in with GitHub', auth_path
+ | to Read and Write
+ / div class="landing-background"
+ / - Post.unscoped.order('char_length(content) desc').first(10).each do |post|
+ / = post_article post, class: 'post-preview' do
+ / header
+ / h1 class="post-title" = link_to post.title, post
+ / = render partial: 'posts/author', locals: { user: post.user }
+ / div class="post-content post-content-preview markdown"
+ / == Markdown.markdown post.preview, flavored: true
+ / div class="clear"
+ / = render partial: 'posts/links', locals: { post: post }
+ = render_git_version
View
35 app/views/layouts/new_application.html.slim
@@ -14,39 +14,10 @@ html
body
section class="main"
header class="main-header"
- h1 class="main-logo" = link_to 'Gistflow', '/'
div class="row"
- nav class="main-auth"
- ul
- li = link_to current_user.username, current_user, class: 'secondary'
- li = link_to account_settings_path do
- i class="icon-cog"
- li = link_to logout_path, class: 'secondary' do
- i class="icon-signout"
- div class="main-search"
- input type="search" placeholder="Search..."
+ h1 class="main-logo" = link_to 'Gistflow', '/'
+ - unless user_signed_in?
+ div class="main-sign-in" = link_to 'Sign In', auth_path
div class="main-row" = yield
footer class="main-footer"
- div class="row"
- nav class="main-footer-menu main-footer-menu-iconed"
- ul
- li class="main-footer-title" Contacts
- li = mail_to 'info@gistflow.com', 'Email', class: 'secondary', encode: 'hex'
- li = link_to 'Github', 'https://github.com/redstonelabs/gistflow', class: 'secondary'
- li = link_to 'Twitter', 'https://twitter.com/gistflow', class: 'secondary'
- ul
- li class="main-footer-title" Buns
- li
- a class="secondary" href="#" Leaderboard
- li
- a class="secondary" href="#" Tags cloud
- li
- a class="secondary" href="#" Map
- p class="main-footer-copyright"
- | Created by
- = link_to 'Redstone Labs', 'https://github.com/redstonelabs'
- br
- | & Sponsored by
- = link_to 'Evrone', 'http://evrone.com'
- div class="clear"
div id="flash"
View
4 app/views/posts/_comments.html.slim
@@ -12,8 +12,8 @@ section class="comments"
- if user_signed_in?
h2 class="new-comment-title" New Comment
- div class="new-comment-template hidden"
- = render @comment
+ / div class="new-comment-template hidden"
+ / = render @comment
div class="new-comment-author"
= link_to current_user, title: current_user.username do
= avatar_image current_user, 84
View
51 app/views/posts/_form.html.slim
@@ -1,30 +1,25 @@
-= form_for @post, html: { class: 'previewable' } do |f|
- = render_error_messages @post
+section class="new-post"
+ header
+ h1 New Post
fieldset
- = f.text_field :title, :placeholder => 'Title'
+ = text_field_tag :title, '', placeholder: 'Title', autofocus: true
+ div class="new-post-hint"
+ | Short description of the content
fieldset
- = f.text_area :content, :size => '40x12', :placeholder => "Preview<cut text=\"More under the cut\">Body", :class => 'hint raw', :id => 'post_content'
- div class="post-hint" You can add tags (at least one is needed) by mentioning in post's body: #gistflow #code #ruby
- div class="preview markdown"
- fieldset
- = f.check_box :question
- = f.label :question, 'Question?'
- fieldset
- = f.check_box :is_private
- = f.label :is_private, 'Private'
- div class="actions group"
- div class="left"
- | This text will be parsed by
- = link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax', :class => 'highlight'
- | . See
- = link_to 'hints', '#', :class => 'hints'
- |.
- div class="button-groups"
- - if @post.persisted?
- div class="button-group"
- = link_to 'Destroy', @post, :method => :delete, :class => 'button danger', :confirm => 'Are you sure?'
- div class="button-group"
- = link_to 'Edit', '#', class: 'button edit'
- = link_to 'Preview', '#', class: 'button preview'
- = f.submit commit_title, class: 'button'
- = render :partial => 'shared/markdown_hints'
+ = text_area_tag :content, '', rows: 16, placeholder: 'Content'
+ div class="new-post-preview"
+ div class="new-post-hint"
+ | You have to add tags by mentioning them in the content:
+ = link_to '#gistflow', tag_path('gistflow')
+ |
+ = link_to '#eventmachine', tag_path('eventmachine')
+ |
+ = link_to '#ruby', tag_path('ruby')
+ div class="new-post-notice"
+ | Content parses by
+ = link_to 'Markdown', 'http://daringfireball.net/projects/markdown/syntax', target: '_blank'
+ div class="form-actions"
+ = link_to 'Preview', api_markdown_path, class: 'button new-post-preview', remote: true
+ = link_to 'Edit', '#', class: 'button new-post-edit hidden'
+ = link_to 'Publish', @post, class: 'button button-primary new-post-submit', data: { method: :post }, remote: true
+ div class="clear"
View
40 app/views/posts/bookmarks.html.slim
@@ -1,5 +1,37 @@
- window_title 'Bookmarks'
-section class="posts"
- header class="primary"
- h1 Bookmarks
- = render :partial => 'posts/index', :locals => { :posts => @posts }
+
+= render partial: 'posts/dynamic', locals: { posts: @posts }
+
+div class="row"
+ div class="left-column"
+ = render 'shared/profile'
+ = render 'shared/follow'
+
+ div class="right-column"
+ section class="bookmarks"
+ header
+ h1 class="content-title" Bookmarks
+
+ - if @posts.any?
+ div class="bookmarks-search"
+ input type="search" placeholder="Search in #{@posts.size} posts" autofocus="true"
+
+ nav class="bookmarks-tags"
+ ul
+ - @tags.first(10).each do |tag|
+ li = link_to tag.name, '#'
+ - if @tags.size > 10
+ li class="bookmarks-tags-show-all"
+ = link_to '#', title: 'Show all tags' do
+ i class="icon-double-angle-right"
+ - @tags.drop(10).each do |tag|
+ li class="hidden" = link_to tag.name, '#'
+ nav class="bookmarks-posts"
+ ul
+ - @posts.each do |post|
+ li
+ = link_to post, class: 'bookmarks-posts-post secondary' do
+ i class="icon-bookmark"
+ |
+ = post.title
+ div class="clear"
View
1  app/views/posts/flow.html.slim
@@ -6,6 +6,7 @@ div class="row"
div class="left-column"
= render 'shared/profile'
= render 'shared/follow'
+ = render 'shared/footer'
div class="right-column"
section class="posts"
View
39 app/views/posts/index.html.slim
@@ -1,14 +1,25 @@
-- window_title 'All'
-section class="posts"
- header
- - if user_signed_in?
- nav class="submenu"
- = link_to_new_post
- nav class="menu"
- ul
- - if user_signed_in?
- li = link_to_unless_current 'Flow', flow_url, :class => 'menu flow_posts', :rel => :nofollow
- li = link_to_unless_current 'All', all_url, :class => 'menu all_posts', :rel => :nofollow
- - else
- li Posts
- = render :partial => 'index', :locals => { :posts => @posts }
+- window_title 'Posts'
+
+= render partial: 'posts/dynamic', locals: { posts: @posts }
+
+div class="row"
+ div class="left-column"
+ # = render 'shared/profile'
+ # = render 'shared/follow'
+ = render 'shared/footer'
+
+ div class="right-column"
+ section class="posts"
+ header
+ h1 class="posts-title" Posts
+
+ - @posts.each do |post|
+ = post_article post, class: 'post-preview' do
+ header
+ h1 class="post-title" = link_to post.title, post
+ = render partial: 'posts/author', locals: { user: post.user }
+ div class="post-content post-content-preview markdown"
+ == Markdown.markdown post.preview, flavored: true
+ div class="clear"
+ = render partial: 'posts/links', locals: { post: post }
+ div class="clear"
View
13 app/views/posts/new.html.slim
@@ -1,6 +1,11 @@
- window_title 'New'
+- title 'New'
-section class="posts"
- header class="primary"
- h1 New
- = render 'form'
+div class="row"
+ div class="left-column"
+ = render 'shared/profile'
+ = render 'shared/follow'
+
+ div class="right-column"
+ = render 'form'
+ div class="clear"
View
20 app/views/posts/show.html.slim
@@ -6,28 +6,30 @@
div class="row"
div class="left-column"
- = render 'shared/profile'
- = render 'shared/follow'
+ - if user_signed_in?
+ = render 'shared/profile'
+ = render 'shared/follow'
+ - else
+ = render partial: 'shared/user', locals: { user: @post.user }
div class="right-column"
= post_article @post, class: 'post-detail' do
header
+ - if user_signed_in?
+ div class="post-back"
+ = link_to flow_path, class: 'secondary' do
+ i class="icon-caret-left"
+ | Back to Flow
h1 class="post-title" = @post.title
div class="post-data"
| by
- = link_to @post.user.username, @post.user
+ = link_to @post.user.username, user_path(@post.user.username)
| at
= time_tag @post.created_at, @post.created_at.to_date.to_s(:long)
div class="post-content markdown"
== Markdown.markdown @post.content, flavored: true
= render partial: 'posts/links', locals: { post: @post }
- / = render partial: 'posts/similar', locals: { post: @post }
= render partial: 'posts/comments', locals: { comments: @post.comments }
div class="clear"
-
-/ div class='at-username-container'
-/ - @post.usernames.each do |username|
-/ div href="#" class="username"
-/ = username
View
4 app/views/shared/_follow.html.slim
@@ -5,4 +5,6 @@ section class="follow"
- Tag.to_follow(current_user).each do |tag|
li
= link_to "##{tag.name}", tag
- | - #{tag.short_description}
+ | - #{tag.short_description}
+
+div class="clear"
View
7 app/views/shared/_footer.html.slim
@@ -0,0 +1,7 @@
+hr class="main-footer-hr"
+p class="main-footer-copyright"
+ | Created by
+ = link_to 'Redstone Labs', 'https://github.com/redstonelabs'
+ br
+ | Sponsored by
+ = link_to 'Evrone', 'http://evrone.com'
View
11 app/views/shared/_profile.html.slim
@@ -1,8 +1,13 @@
section class="profile"
header
div class="profile-avatar"
- = avatar_image current_user, 160
- h1 class="profile-title" = current_user.username
+ = link_to user_path(current_user.username) do
+ = avatar_image current_user, 160
+ h1 class="profile-title"
+ = link_to current_user.username, user_path(current_user.username)
+ = link_to '#', class: 'profile-settings' do
+ i class="icon-cog"
+ i class="profile-settings-caret icon-caret-down"
div class="profile-tags"
a href="#" class="secondary" 15 notifications
div class="clear"
@@ -18,7 +23,7 @@ section class="profile"
span class="profile-stats-stat" Likes
span class="profile-stats-value" = current_user.rating
div class="profile-new-post"
- = link_to 'New Post', new_post_path
+ = link_to 'New Post', new_post_path, class: "#{'active' if current_page?(controller: 'posts', action: 'new')}"
div class="profile-menu"
ul
View
19 app/views/shared/_user.html.slim
@@ -0,0 +1,19 @@
+section class="profile"
+ header
+ div class="profile-avatar"
+ = link_to user_path(user) do
+ = avatar_image user, 160
+ h1 class="profile-title"
+ = link_to user_path(user) do
+ = user.username
+ div class="profile-follow"
+ = link_to auth_path, class: 'button' do
+ i class="icon-user"
+ | Follow
+ div class="clear"
+ div class="profile-data"
+ ul
+ - if user.profile.company?
+ li = user.profile.company
+ - if user.profile.email?
+ li = mail_to user.profile.email, user.profile.email, encode: :hex
View
35 app/views/users/show.html.slim
@@ -1,6 +1,29 @@
-- title "#{@user}'s posts"
-= render :partial => 'sidebar', :locals => { :user => @user }
-section class="posts"
- header class="primary"
- h1 = @user.username
- = render :partial => 'posts/index', :locals => { :posts => @posts }
+- title "#{@user}'s blog"
+
+- window_title 'Flow'
+= render partial: 'posts/dynamic', locals: { posts: @posts }
+
+div class="row"
+ div class="left-column"
+ - if user_signed_in?
+ = render 'shared/profile'
+ = render 'shared/follow'
+ - else
+ = render partial: 'shared/user', locals: { user: @user }
+ = render 'shared/footer'
+
+ div class="right-column"
+ section class="posts"
+ header
+ h1 class="posts-title" #{@user.name}'s Blog
+
+ - @posts.each do |post|
+ = post_article post, class: 'post-preview' do
+ header
+ h1 class="post-title" = link_to post.title, post
+ = render partial: 'posts/author', locals: { user: post.user }
+ div class="post-content post-content-preview markdown"
+ == Markdown.markdown post.preview, flavored: true
+ div class="clear"
+ = render partial: 'posts/links', locals: { post: post }
+ div class="clear"
View
9 config/routes.rb
@@ -22,7 +22,7 @@
post '/subscriptions/:tag_id' => 'subscriptions#create', :as => :subscribe
delete '/subscriptions/:tag_id' => 'subscriptions#destroy'
resources :subscriptions, only: :index
-
+
resources :likes, only: [:create] do
delete :destroy, on: :collection
end
@@ -36,13 +36,12 @@
get :new_private
get :leaderboard
end
-
+
resources :comments, except: :index, module: :posts
end
resource :search, only: :create
- get '/empty_search' => 'searches#empty', as: 'nil_search'
get '/search/:query' => 'searches#show', as: 'show_search'
resources :tags, only: :show do
@@ -68,8 +67,8 @@
post '/api/markdown', to: 'markdown#create'
- resource :map
+ resource :map, only: :show
root to: 'landings#show'
- match '*a', to: 'errors#not_found'
+ match ':username', to: 'errors#not_found', as: :user
end
View
5,516 vendor/assets/javascripts/codemirror.js
5,516 additions, 0 deletions not shown
View
96 vendor/assets/javascripts/codemirror_modes/gfm.js
@@ -0,0 +1,96 @@
+CodeMirror.defineMode("gfm", function(config) {
+ var codeDepth = 0;
+ function blankLine(state) {
+ state.code = false;
+ return null;
+ }
+ var gfmOverlay = {
+ startState: function() {
+ return {
+ code: false,
+ codeBlock: false,
+ ateSpace: false
+ };
+ },
+ copyState: function(s) {
+ return {
+ code: s.code,
+ codeBlock: s.codeBlock,
+ ateSpace: s.ateSpace
+ };
+ },
+ token: function(stream, state) {
+ // Hack to prevent formatting override inside code blocks (block and inline)
+ if (state.codeBlock) {
+ if (stream.match(/^```/)) {
+ state.codeBlock = false;
+ return null;
+ }
+ stream.skipToEnd();
+ return null;
+ }
+ if (stream.sol()) {
+ state.code = false;
+ }
+ if (stream.sol() && stream.match(/^```/)) {
+ stream.skipToEnd();
+ state.codeBlock = true;
+ return null;
+ }
+ // If this block is changed, it may need to be updated in Markdown mode
+ if (stream.peek() === '`') {
+ stream.next();
+ var before = stream.pos;
+ stream.eatWhile('`');
+ var difference = 1 + stream.pos - before;
+ if (!state.code) {
+ codeDepth = difference;
+ state.code = true;
+ } else {
+ if (difference === codeDepth) { // Must be exact
+ state.code = false;
+ }
+ }
+ return null;
+ } else if (state.code) {
+ stream.next();
+ return null;
+ }
+ // Check if space. If so, links can be formatted later on
+ if (stream.eatSpace()) {
+ state.ateSpace = true;
+ return null;
+ }
+ if (stream.sol() || state.ateSpace) {
+ state.ateSpace = false;
+ if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {
+ // User/Project@SHA
+ // User@SHA
+ // SHA
+ return "link";
+ } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {
+ // User/Project#Num
+ // User#Num
+ // #Num
+ return "link";
+ }
+ }
+ if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i)) {
+ // URLs
+ // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls
+ // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine
+ return "link";
+ }
+ stream.next();
+ return null;
+ },
+ blankLine: blankLine
+ };
+ CodeMirror.defineMIME("gfmBase", {
+ name: "markdown",
+ underscoresBreakWords: false,
+ taskLists: true,
+ fencedCodeBlocks: true
+ });
+ return CodeMirror.overlayMode(CodeMirror.getMode(config, "gfmBase"), gfmOverlay);
+}, "markdown");
View
246 vendor/assets/stylesheets/codemirror.css
@@ -0,0 +1,246 @@
+/* BASICS */
+
+.CodeMirror {
+ /* Set height, width, borders, and global font properties here */
+ font-family: monospace;
+ height: 300px;
+}
+.CodeMirror-scroll {
+ /* Set scrolling behaviour here */
+ overflow: auto;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+ padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+ padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler {
+ background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+ border-right: 1px solid #ddd;
+ background-color: #f7f7f7;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+ padding: 0 3px 0 5px;
+ min-width: 20px;
+ text-align: right;
+ color: #999;
+}
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+ border-left: 1px solid black;
+ z-index: 3;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+ border-left: 1px solid silver;
+}
+.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
+ width: auto;
+ border: 0;
+ background: #7e7;
+ z-index: 1;
+}
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
+
+.cm-tab { display: inline-block; }
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable {color: black;}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-property {color: black;}
+.cm-s-default .cm-operator {color: black;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-error {color: #f00;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+
+.cm-invalidchar {color: #f00;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+ the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+ line-height: 1;
+ position: relative;
+ overflow: hidden;
+ background: white;
+ color: black;
+}
+
+.CodeMirror-scroll {
+ /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */
+ margin-bottom: -30px; margin-right: -30px;
+ padding-bottom: 30px; padding-right: 30px;
+ height: 100%;
+ outline: none; /* Prevent dragging from highlighting the element */
+ position: relative;
+}
+.CodeMirror-sizer {
+ position: relative;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+ before actuall scrolling happens, thus preventing shaking and
+ flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler {
+ position: absolute;
+ z-index: 6;
+ display: none;
+}
+.CodeMirror-vscrollbar {
+ right: 0; top: 0;
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+ bottom: 0; left: 0;
+ overflow-y: hidden;
+ overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+ right: 0; bottom: 0;
+ z-index: 6;
+}
+
+.CodeMirror-gutters {
+ position: absolute; left: 0; top: 0;
+ height: 100%;
+ padding-bottom: 30px;
+ z-index: 3;
+}
+.CodeMirror-gutter {
+ height: 100%;
+ padding-bottom: 30px;
+ margin-bottom: -32px;
+ display: inline-block;
+ /* Hack to make IE7 behave */
+ *zoom:1;
+ *display:inline;
+}
+.CodeMirror-gutter-elt {
+ position: absolute;
+ cursor: default;
+ z-index: 4;
+}
+
+.CodeMirror-lines {
+ cursor: text;
+}
+.CodeMirror pre {
+ /* Reset some styles that the rest of the page might have set */
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+ border-width: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ margin: 0;
+ white-space: pre;
+ word-wrap: normal;
+ line-height: inherit;
+ color: inherit;
+ z-index: 2;
+ position: relative;
+ overflow: visible;
+}
+.CodeMirror-wrap pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+}
+.CodeMirror-linebackground {
+ position: absolute;
+ left: 0; right: 0; top: 0; bottom: 0;
+ z-index: 0;
+}
+
+.CodeMirror-linewidget {
+ position: relative;
+ z-index: 2;
+ overflow: auto;
+}
+
+.CodeMirror-widget {
+ display: inline-block;
+}
+
+.CodeMirror-wrap .CodeMirror-scroll {
+ overflow-x: hidden;
+}
+
+.CodeMirror-measure {
+ position: absolute;
+ width: 100%; height: 0px;
+ overflow: hidden;
+ visibility: hidden;
+}
+.CodeMirror-measure pre { position: static; }
+
+.CodeMirror div.CodeMirror-cursor {
+ position: absolute;
+ visibility: hidden;
+ border-right: none;
+ width: 0;
+}
+.CodeMirror-focused div.CodeMirror-cursor {
+ visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+
+.cm-searching {
+ background: #ffa;
+ background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
+
+@media print {
+ /* Hide the cursor when printing */
+ .CodeMirror div.CodeMirror-cursor {
+ visibility: hidden;
+ }
+}
View
26 vendor/assets/stylesheets/twilight.css
@@ -0,0 +1,26 @@
+.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/
+.cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/
+
+.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; }
+.cm-s-twilight .CodeMirror-linenumber { color: #aaa; }
+.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; }
+
+.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/
+.cm-s-twilight .cm-atom { color: #FC0; }
+.cm-s-twilight .cm-number { color: #ca7841; } /**/
+.cm-s-twilight .cm-def { color: #8DA6CE; }
+.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/
+.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/
+.cm-s-twilight .cm-operator { color: #cda869; } /**/
+.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/
+.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/
+.cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/
+.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/
+.cm-s-twilight .cm-error { border-bottom: 1px solid red; }
+.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/
+.cm-s-twilight .cm-tag { color: #997643; } /**/
+.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/
+.cm-s-twilight .cm-header { color: #FF6400; }
+.cm-s-twilight .cm-hr { color: #AEAEAE; }
+.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/
+

No commit comments for this range

Something went wrong with that request. Please try again.