Skip to content

Commit 49a7088

Browse files
committed
Render custom color scheme via css action; iterate on color scheme ux
1 parent 77de91b commit 49a7088

File tree

6 files changed

+138
-94
lines changed

6 files changed

+138
-94
lines changed

app/controllers/application_controller.rb

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,25 @@ class ApplicationController < ActionController::Base
22
include Erroring
33
include Authentication
44

5-
before_action :set_color_theme
5+
def custom_color_scheme_params = preview_color_scheme_id ? {settings: {color_scheme_id: preview_color_scheme_id}} : {}
6+
helper_method :custom_color_scheme_params
67

7-
def set_color_theme
8-
@color_scheme = find_color_theme
8+
def custom_color_scheme?
9+
preview_color_scheme_id.present? || session_color_scheme_id.present?
910
end
11+
helper_method :custom_color_scheme?
1012

11-
def find_color_theme
12-
if session[:color_scheme_id]
13-
begin
14-
return ColorScheme.find(session[:color_scheme_id])
15-
rescue ActiveRecord::RecordNotFound
16-
end
17-
end
13+
def preview_color_scheme_id = params.dig(:settings, :color_scheme_id)
1814

19-
ColorScheme.cached_default
15+
def session_color_scheme_id = session[:color_scheme_id]
16+
17+
def find_color_scheme
18+
preview_color_scheme || session_color_scheme || default_color_scheme
2019
end
20+
21+
def preview_color_scheme = preview_color_scheme_id && ColorScheme.find(preview_color_scheme_id)
22+
23+
def session_color_scheme = session_color_scheme_id && ColorScheme.find(session_color_scheme_id)
24+
25+
def default_color_scheme = @default_color_scheme ||= ColorScheme.cached_default
2126
end

app/controllers/settings/color_schemes_controller.rb

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
class Settings::ColorSchemesController < ApplicationController
22
def show
3-
@color_scheme = selected_color_scheme || session_color_scheme || ColorScheme.cached_default
4-
@settings = Settings.new(color_scheme: @color_scheme)
5-
6-
render ColorSchemes::ShowView.new(
7-
settings: @settings,
8-
fallback_color_scheme: session_color_scheme || ColorScheme.cached_default,
9-
curated_color_schemes: ColorScheme.cached_curated,
10-
selected: selected_color_scheme_id.present?,
11-
saved: session[:color_scheme_id].presence == @color_scheme.id
12-
)
3+
@color_scheme = find_color_scheme
4+
5+
respond_to do |format|
6+
format.html {
7+
render ColorSchemes::ShowView.new(
8+
settings: Settings.new(color_scheme: @color_scheme),
9+
curated_color_schemes: ColorScheme.cached_curated,
10+
preview_color_scheme: preview_color_scheme,
11+
session_color_scheme: session_color_scheme,
12+
default_color_scheme: default_color_scheme
13+
)
14+
}
15+
format.css {
16+
render ColorSchemes::Css.new(color_scheme: @color_scheme), layout: false
17+
}
18+
end
1319
end
1420

1521
def update
@@ -30,9 +36,11 @@ def update
3036

3137
private
3238

33-
def selected_color_scheme_id = params.dig(:settings, :color_scheme_id) || session[:color_scheme_id]
39+
def preview_color_scheme_id = params.dig(:settings, :color_scheme_id)
40+
41+
def default_color_scheme = @default_color_scheme ||= ColorScheme.cached_default
3442

3543
def session_color_scheme = session[:color_scheme_id] && ColorScheme.find(session[:color_scheme_id])
3644

37-
def selected_color_scheme = selected_color_scheme_id && ColorScheme.find(selected_color_scheme_id)
45+
def preview_color_scheme = preview_color_scheme_id && ColorScheme.find(preview_color_scheme_id)
3846
end
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
<style>
2-
:root {
3-
<%= render ColorSchemes::Css.new(color_scheme: @color_scheme || ColorScheme.find_or_create_default) %>
4-
}
5-
</style>
1+
<% if custom_color_scheme? %>
2+
<%= stylesheet_link_tag settings_color_scheme_path(**custom_color_scheme_params, format: :css) %>
3+
<% else %>
4+
<style>
5+
<%= render ColorSchemes::Css.new(color_scheme: ColorScheme.cached_default) %>
6+
</style>
7+
<% end %>

app/views/color_schemes/show_view.rb

Lines changed: 83 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@ class ColorSchemes::ShowView < ApplicationView
66
include Phlex::Rails::Helpers::ButtonTo
77
include Phlex::Rails::Helpers::ContentFor
88

9-
def initialize(settings:, fallback_color_scheme: nil, curated_color_schemes: [], selected: false, saved: false)
9+
def initialize(
10+
settings:,
11+
curated_color_schemes: [],
12+
default_color_scheme: ColorScheme.cached_default,
13+
preview_color_scheme: nil,
14+
session_color_scheme: nil
15+
)
1016
@settings = settings
1117
@color_scheme = settings.color_scheme
12-
@fallback_color_scheme = fallback_color_scheme
1318
@curated_color_schemes = curated_color_schemes
14-
@selected = selected
15-
@saved = saved
19+
@preview_color_scheme = preview_color_scheme
20+
@session_color_scheme = session_color_scheme
21+
@default_color_scheme = default_color_scheme
1622
end
1723

1824
def view_template
@@ -21,9 +27,9 @@ def view_template
2127
end
2228
render Pages::Header.new(title: "Theme: Color")
2329
div(class: "section-content container py-gap") do
24-
if @saved || @selected
30+
if previewing? || preserving?
2531
h3 do
26-
plain "You are now #{@saved ? "using" : "previewing"} the"
32+
plain "You are now #{(@color_scheme == @session_color_scheme) ? "using" : "previewing"} the"
2733
whitespace
2834
span(class: "emphasis") { @color_scheme.display_name }
2935
whitespace
@@ -36,81 +42,102 @@ def view_template
3642
p { "You can preview and save your desired color scheme for this site. We have curated some options for you below." }
3743

3844
div(class: "flex items-center") do
39-
span(class: "mr-2 text-small") { "Preview" }
40-
41-
form_with(model: @settings, url: url_for, method: :get) do |f|
42-
fieldset do
43-
f.select(
44-
:color_scheme_id,
45-
@curated_color_schemes.map { |cs| [cs.display_name, cs.id] },
46-
{
47-
prompt: "Pick one!",
48-
selected: @selected && @color_scheme.id
49-
},
50-
# requestSubmit and Turbo
51-
# https://stackoverflow.com/questions/68624668/how-can-i-submit-a-form-on-input-change-with-turbo-streams
52-
onchange: "this.form.requestSubmit()",
53-
class: "mr-2"
54-
)
55-
end
56-
end
45+
preview_select
5746

5847
span(class: "mr-2 text-small") { "OR" }
5948

6049
link_to "I feel lucky!",
6150
settings_color_scheme_path(settings: {color_scheme_id: @curated_color_schemes.sample.id}),
6251
class: "button secondary mr-2"
6352

64-
if @selected && @color_scheme != @fallback_color_scheme
53+
if previewing? && (@color_scheme != (@session_color_scheme || @default_color_scheme))
6554
span(class: "mr-2 text-small") { "OR" }
6655

67-
button_to "Reset preview",
68-
settings_color_scheme_path(settings: {color_scheme_id: @fallback_color_scheme.id}),
69-
method: :patch,
56+
link_to "Reset preview",
57+
settings_color_scheme_path,
7058
class: "button tertiary mr-2"
7159
end
7260
end
7361

74-
if @selected
75-
div(class: "flex items-center") do
76-
span(class: "mr-2 text-small") { plain "Save" }
62+
if previewing?
63+
h3 { @preview_color_scheme.display_name }
64+
p { "You are previewing #{@preview_color_scheme.display_name}." }
65+
color_swatches(@preview_color_scheme)
66+
p do
67+
plain "Click"
68+
whitespace
69+
span(class: "emphasis") { "Save" }
70+
whitespace
71+
plain "to set #{@preview_color_scheme.display_name} as your new color scheme."
72+
end
73+
save_preview_button
74+
end
7775

78-
button_to "Save this color scheme",
79-
settings_color_scheme_path(settings: {color_scheme_id: @color_scheme.id}),
80-
method: :patch,
81-
class: "button primary mr-2"
76+
if preserving?
77+
h3 { @session_color_scheme.display_name }
78+
p { "You have saved #{@session_color_scheme.display_name} as your personal color scheme." }
79+
color_swatches(@session_color_scheme)
80+
end
8281

83-
span(class: "mr-2 text-small") { unsafe_raw "&bull;" }
82+
h3 { @default_color_scheme.display_name }
83+
p { "This is the default color scheme for this site." }
84+
color_swatches(@default_color_scheme)
85+
if preserving?
86+
p { "You can delete #{@session_color_scheme.display_name} as your color scheme choice and go back to the default color scheme by clicking the Delete button below." }
87+
unsave_button
88+
end
89+
end
90+
end
8491

85-
button_to "Reset to default",
86-
settings_color_scheme_path(settings: {color_scheme_id: ColorScheme.cached_default.id}),
87-
method: :patch,
88-
class: "button tertiary mr-2"
89-
end
92+
def preview_select
93+
form_with(model: @settings, url: url_for, method: :get) do |f|
94+
fieldset do
95+
f.select(
96+
:color_scheme_id,
97+
@curated_color_schemes.sort_by { |cs| cs.name }.map { |cs| [cs.display_name, cs.id] },
98+
{
99+
prompt: "Pick one!",
100+
selected: previewing? && @color_scheme.id
101+
},
102+
# requestSubmit and Turbo
103+
# https://stackoverflow.com/questions/68624668/how-can-i-submit-a-form-on-input-change-with-turbo-streams
104+
onchange: "this.form.requestSubmit()",
105+
class: "mr-2"
106+
)
90107
end
108+
end
109+
end
91110

92-
h3 { display_name }
111+
def save_preview_button
112+
button_to "Save #{@preview_color_scheme.display_name}",
113+
settings_color_scheme_path(settings: {color_scheme_id: @preview_color_scheme.id}),
114+
method: :patch,
115+
class: "button primary mr-2"
116+
end
93117

94-
div(class: "color-scheme color-scheme__#{@color_scheme.name.parameterize}") do
95-
@color_scheme.weights.each do |weight, color|
96-
div(class: "color-swatch color-swatch__weight:#{weight}", style: "background-color: #{color.hex}") do
97-
div(class: "color-swatch__weight") { weight }
98-
div(class: "color-swatch__color") { color.hex.delete("#").upcase }
99-
end
118+
def unsave_button
119+
button_to "Delete my color scheme choice",
120+
settings_color_scheme_path(settings: {color_scheme_id: ColorScheme.cached_default.id}),
121+
method: :patch,
122+
class: "button warn mr-2"
123+
end
124+
125+
def color_swatches(color_scheme)
126+
div(class: "color-scheme color-scheme__#{color_scheme.name.parameterize}") do
127+
color_scheme.weights.each do |weight, color|
128+
div(class: "color-swatch color-swatch__weight:#{weight}", style: "background-color: #{color.hex}") do
129+
div(class: "color-swatch__weight") { weight }
130+
div(class: "color-swatch__color") { color.hex.delete("#").upcase }
100131
end
101132
end
102133
end
103134
end
104135

105136
private
106137

107-
def default_color_scheme? = @color_scheme.id == ColorScheme.cached_default.id
138+
def previewing? = @preview_color_scheme.present?
108139

109-
def display_name
110-
if default_color_scheme?
111-
"#{@color_scheme.display_name} (default)"
112-
else
113-
@color_scheme.display_name
114-
end
115-
end
140+
def preserving? = @session_color_scheme.present?
141+
142+
def default_color_scheme? = @color_scheme.id == @default_color_scheme
116143
end

app/views/components/color_schemes/css.rb

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ def initialize(color_scheme:)
55
@color_scheme = color_scheme
66
end
77

8+
def view_template
9+
unsafe_raw <<-CSS
10+
:root {
11+
#{color_scheme.weights.map { |weight, color| "--color-#{color_name}-#{weight}: #{to_hsla_css(color)};" }.join("\n\t\t")}
12+
#{color_scheme.weights.map { |weight, color| "--my-color-#{weight}: var(--color-#{color_name}-#{weight});" }.join("\n\t\t")}
13+
}
14+
CSS
15+
end
16+
17+
private
18+
819
def color_name
920
color_scheme.name.parameterize
1021
end
@@ -13,13 +24,4 @@ def to_hsla_css(color)
1324
hsl = color.hsl
1425
"hsla(#{hsl[:h]}, #{hsl[:s]}%, #{hsl[:l]}%, 1)"
1526
end
16-
17-
def view_template
18-
color_scheme.weights.each do |weight, color|
19-
unsafe_raw "--color-#{color_name}-#{weight}: #{to_hsla_css(color)};\n"
20-
end
21-
color_scheme.weights.each do |weight, color|
22-
unsafe_raw "--my-color-#{weight}: var(--color-#{color_name}-#{weight});\n"
23-
end
24-
end
2527
end

spec/system/settings/color_schemes_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
chosen_color = curated_colors.second
1616
select chosen_color.display_name, from: "settings[color_scheme_id]"
1717

18-
click_button "Save this color scheme"
18+
click_button "Save #{chosen_color.display_name}"
1919

2020
expect(page).to have_content("You are now using the #{chosen_color.display_name} color scheme")
2121

0 commit comments

Comments
 (0)