diff --git a/app/assets/stylesheets/themes/dark.css b/app/assets/stylesheets/themes/dark.css new file mode 100644 index 0000000..38b2c05 --- /dev/null +++ b/app/assets/stylesheets/themes/dark.css @@ -0,0 +1,23 @@ +ol.stories.list li.story div.details span.link a:link { + color: #6898ff; +} + +ol.stories.list li.story div.details span.link a:visited { + color: #2858bf; +} + +a { + color: #6898ff; +} + +a.tag { + background-color: #000; + border: 1px solid #ccc; + color: #ccc; +} + +body { + background: #000; + color: #ccc; +} + diff --git a/app/assets/stylesheets/themes/light.css b/app/assets/stylesheets/themes/light.css new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/stylesheets/themes/neo_dark.css b/app/assets/stylesheets/themes/neo_dark.css new file mode 100644 index 0000000..b98b461 --- /dev/null +++ b/app/assets/stylesheets/themes/neo_dark.css @@ -0,0 +1,148 @@ +body { + background-color: #222; + color: #ddd; +} + +a { + color: #ccf; +} + +#wrapper textarea, #wrapper input, #wrapper button { + color: #ddd; + background-color: #000; + border-color: #444; +} + +#header .headerlinks a.cur_url { + color: #fff; +} + +#header #headertitle a { + color: #fff; +} + +#header .headerlinks a { + color: #ccc; +} + +#inside li .link a { + color: #ddf; +} + +#inside li .byline { + color: #bbb; +} + +#inside li .byline a { + color: #bbb; +} + +#inside li .domain { + color: #bbb; +} + +#inside .comment a { + color: #ccf; +} + +#wrapper div.morelink a { + color: #ccc; +} + +#wrapper div#footer a { + color: #ccc; +} + +.comment:target { + background-color: #444; +} + +/* tag badges */ +#inside a.tag { + background-color: #000; + border-color: #444; + color: #aaa; +} + +#inside a.tag.tag_is_media { + background-color: #622; + border-color: #944; +} + +#inside a.tag.tag_announce, #inside a.tag.tag_ask, #inside a.tag.tag_show, #inside a.tag.tag_interview { + background-color: #226; + border-color: #449; +} + +/* hats */ +#inside span.hat span.crown { + background-color: #000; + border-color: #444; +} + +#inside span.hat { + border-color: #444; +} + +#inside span.hat span.crown, #inside span.hat a { + color: #aaa; +} + +/* tag dropdown */ +#inside .select2-container-multi .select2-choices { + background-color: #000; + border-color: #444; +} + +#inside .select2-container .select2-drop { + background-color: #000; + border-color: #444; +} + +/* search pager */ +#inside div.page_link_buttons a { + color: #bbb; + background-color: #000; + border-color: #444; +} + +#inside div.page_link_buttons a.cur, #inside div.page_link_buttons span { + color: #bbb; + background-color: #222; + border-color: #222; +} + +/* history/filter table */ +#inside table.data th { + background-color: #000; + border-color: #444; +} + +#inside table.data tr.row0 td, table.data.zebra tr:nth-child(2n) td { + background-color: #222; + border-color: #444; +} + +#inside table.data tr.row1 td, table.data.zebra tr:nth-child(2n+1) td { + background-color: #000; + border-color: #444; +} + +/* mobile/responsive fixes */ +ol.stories.list li.story div.story_liner { + background-color: inherit; +} + +div#header, div#leader { + background-color: inherit; + border-bottom: 1px solid #444; +} + +ol.stories.list li.story .mobile_comments { + background-color: #444; +} + +ol.stories.list li.story { + border-bottom: 1px solid #444; +} + diff --git a/app/assets/stylesheets/themes/solarized_dark.css b/app/assets/stylesheets/themes/solarized_dark.css new file mode 100644 index 0000000..960fcec --- /dev/null +++ b/app/assets/stylesheets/themes/solarized_dark.css @@ -0,0 +1,137 @@ +body { + background-color: #073642; + color: #93a1a1; +} + +a { + color: #b58900; +} + +#wrapper textarea, #wrapper input, #wrapper button { + color: #93a1a1; + background-color: #002b36; + border-color: #073642; +} + +#header .headerlinks a.cur_url { + color: #2aa198; +} + +#header #headertitle a { + color: #2aa198; +} + +#header .headerlinks a { + color: #839496; +} + +#inside li .link a { + color: #b58900; +} + +#inside li .byline { + color: #839496; +} + +#inside li .byline a { + color: #839496; +} + +#inside li .domain { + color: #839496; +} + +#inside .comment a { + color: #b58900; +} + +#wrapper div.morelink a { + color: #839496; +} + +#wrapper div#footer a { + color: #839496; +} + +/* header logo */ +#wrapper #header #headerleft #l_holder { + background-color: #dc322f !important; +} + +/* buttons */ +div.voters .upvoter:hover, .upvoted div.voters .upvoter { + border-bottom-color: #dc322f; +} + + +/* tag badges */ +#inside a.tag { + background-color: #002b36; + border-color: #073642; + color: #aaa; +} + +#inside a.tag.tag_is_media { + background-color: #622; + border-color: #944; +} + +#inside a.tag.tag_announce, #inside a.tag.tag_ask, #inside a.tag.tag_show, #inside a.tag.tag_interview { + background-color: #226; + border-color: #449; +} + +/* hats */ +#inside span.hat span.crown { + background-color: #002b36; + border-color: #073642; +} + +#inside span.hat { + border-color: #073642; +} + +#inside span.hat span.crown, #inside span.hat a { + color: #aaa; +} + +/* tag dropdown */ +#inside .select2-container-multi .select2-choices { + background-color: #002b36; + border-color: #073642; +} + +#inside .select2-container .select2-drop { + background-color: #002b36; + border-color: #073642; +} + +/* search pager */ +#inside div.page_link_buttons a { + color: #839496; + background-color: #002b36; + border-color: #073642; +} + +#inside div.page_link_buttons a.cur, #inside div.page_link_buttons span { + color: #839496; + background-color: #073642; + border-color: #073642; +} + +/* history/filter table */ +#inside table.data th { + background-color: #002b36; + border-color: #073642; +} + +#inside table.data tr.row0 td, table.data.zebra tr:nth-child(2n) td { + background-color: #073642; + border-color: #073642; +} + +#inside table.data tr.row1 td, table.data.zebra tr:nth-child(2n+1) td { + background-color: #002b36; + border-color: #073642; +} + diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index a597080..70643b0 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -246,7 +246,7 @@ private :email_replies, :email_messages, :email_mentions, :pushover_replies, :pushover_messages, :pushover_mentions, :mailing_list_mode, :show_avatars, :show_story_previews, - :show_submitted_story_threads, :hide_dragons + :show_submitted_story_threads, :hide_dragons, :theme ) end end diff --git a/app/models/user.rb b/app/models/user.rb index b0a0166..27b71e2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,11 +51,14 @@ class User < ActiveRecord::Base s.string :twitter_oauth_token s.string :twitter_oauth_token_secret s.string :twitter_username + s.string :theme, :default => "light" end validates :email, :format => { :with => /\A[^@ ]+@[^@ ]+\.[^@ ]+\Z/ }, :uniqueness => { :case_sensitive => false } + validates :theme, inclusion: { in: ["light", "dark", "neo_dark", "solarized_dark"] } + validates :password, :presence => true, :on => :create VALID_USERNAME = /[A-Za-z0-9][A-Za-z0-9_-]{0,24}/ diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d7aab42..bcc7d86 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -25,6 +25,8 @@ Rails.application.name %> <%= stylesheet_link_tag "application", :media => "all" %> <% if @user %> + <%= stylesheet_link_tag "themes/" + @user.theme, :media => "all" %> + <%= javascript_include_tag "application" %>